Linux Linux 三剑客

思寒_seveniruby for 霍格沃兹测试学院外部交流圈 · January 24, 2019 · Last by 梧桐雨 replied at May 06, 2019 · 5472 hits

环境

  • windows git bash
  • mac iterm term
  • 用自己的帐号登录 ssh 手机号码后8位@shell.testing-studio.com
  • 没有账号的可以临时用 ssh hogwarts2019@shell.testing-studio.com
  • /tmp/nginx.log 保存了一份一天的nginx访问log

Linux三剑客介绍


Grep


ps -ef  | grep bash
echo "ABC" | grep -i abc
ps -ef | grep bash | grep -v grep
echo "1234 7654" | grep -o "[0-9]4"
echo "1234 7654" | grep -oE "[0-9]4|76"

测试题

  • 找出nginx.log中所有404和503报错的log数据,取出前3条数据,把命令贴到回复里
  • 找出testerhome首页的所有http和https的链接

awk



ps | awk 'BEGIN{print "start"}{print $0}END{print "end"}'
awk '/ 404 | 500 /' /tmp/nginx.log
echo '1
2
3
4
5' | awk '/2/,/4/'
echo '1
2
3
4
5' | awk '$0>3'
ps | awk 'NR>1'

ps | awk '{print $NF}'
echo $PATH | awk 'BEGIN{RS=":"}{print $0}' | grep -v "^$" | awk 'BEGIN{FS="\n";ORS=":"}{print $0}END{printf "\n" }'
echo '1,10
2,20
3,30' | awk 'BEGIN{a=0;FS=","}{a+=$2}END{print a,a/NR}'
awk 'BEGIN{print 33*20*76/200/3}'
echo "123|456_789" | awk 'BEGIN{FS="\\||_"}{print $2}'
echo "123|456_789" | awk "BEGIN{FS=\"\\\\||_\"}{print \$2}" #尽量使用单引号

测试题

  • 找出404和500的数据,只打印状态码这一列,然后排序去重。把命令贴到回复里
  • 去testerhome首页找到所有的http的连接,然后打印不带http的纯域名部分

sed

pattern表达式

  • 20 30,35 行数与行数范围
  • /pattern/ 正则匹配
  • //,// 正则匹配的区间

action

  • d 删除
  • p 打印,通畅结合-n参数
  • s/REGEXP/REPLACEMENT/[FLAGS]
  • 替换时引用 \1 \2 匹配的字段
ps | sed -n 1,3p
ps | sed 's/CMD/command/'
ps | sed -n '/ps/p'
echo '1
2
3
4
5' | sed -n '/3/,/4/p'
echo '1
2
3
4
5' | sed '/3/,/4/d'
ps | sed -e 's/CMD/command/' -e 's#00#20#g'

测试题

  • 对所有404 500 的数据,统计出现这种状态码的url,需要对url汇总(汇总相似的url,把相同的资源但是变化的id去掉)去重,打印前5个出问题的路径,把命令贴到回复里

演练

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 27 条回复 时间 点赞

grep -E ' 404 | 503 ' /tmp/nginx.log | head -3

grep -oE 400|500 /tmp/nginx.log | head -3

grep -E " 404 | 503 " /tmp/nginx.log | head -3

grep -E " 404 | 503 " nginx.log | head -3
5Floor has been deleted

curl https://testerhome.com/ | grep -iE "http|https"

grep -E ' 404 | 500 ' nginx.log | awk '{print $9}' | sort | uniq -c

awk '/ 404 | 500 /{print $9}' nginx.log | sort | uniq -c

grep -E " 404 | 500 " /tmp/nginx.log | awk '{print $9}' | sort | uniq -c

grep -E " 404 | 500 " /tmp/nginx.log | awk '{print $9}' | sort | uniq -c

awk '/ 404 | 500 /{print $7}' nginx.log |sed 's#/[0-9]*/#/x/#g'|sort | uniq -c | sort -nr |  head -5

作业3:

awk '/ 404 /{print $7}' /tmp/nginx.log |sed 's#[0-9]\{1,\}#*#g' | sort | uniq -c | sort -nr | head -5
grep -e " 404 " /tmp/nginx.log|less|awk '{print $7}'|sed -e "s#[0-9]\{1,\}#*#g"|sort|uniq -c|sort -u|head -5

awk '/ 404 | 500 /' /tmp/nginx.log |awk '{print $7}'| sed -n 's/url/*/g'| sort | uniq -c |less

awk '/ 404 | 500 /{print $7}' nginx.log | sed -e 's#[0-9]\{1,\}#*#g' | sort | uniq -c | sort -nr | head -5

Stella1015 回复

花括号需要转义

echo "123|456_789" | awk 'BEGIN{FS="\\||_"}{print $2}' 

请问这里

”\\||_"

为什么就是表明了分隔符是|和_啊? 转译不是一个斜杠就可以了嘛, 这里有两个斜杠?

awk  '/ 404|500 /{print $7}'  /tmp/nginx.log | sed 's#[0-9]\{1,\}#*#g' | sort | uniq -c | sort -nr | head -5
Freya.Ding 回复
echo "123|456_789" | awk 'BEGIN{FS="\\||_"}{print $2}'

问,我也有这个疑问,思寒老师 ,为啥是两个斜杠,有一个斜杠是转义| 的,另一个斜杠呢?

Author only
小九 回复

因为双引号存在,最外层单引号确保整个内容是原样传递给awk的。然后awk收到了双引号,双引号在awk内部也有转义,然后两个反斜杠变成了一个反斜杠。这样FS就会能正常的知道竖杠不是正则了。

awk '/ 404 | 500 /' /tmp/nginx.log | awk '{print $7}' | sort -nr | uniq -c| sort -nr | head -5

明白了,谢谢

思寒_seveniruby 公开课_Shell 进阶_20190220 中提及了此贴 20 Feb 20:24

老师问一下,下面这种情况是什么原因了

ls | grep '*.test'  #找不到文件
find ./ -name '*.test' #可以找到文件
jiaxiong 回复

我来回答一下😁
首先 ‘*.test’ 是单引号括起,内容原样输出 *.test 表正则。
其次正则中 * 为限定符,修饰前一个字符或分组重复零次或多次。
而你这 * 在开头前面没有字符或分组。所以匹配不到

你可以这样:
ls | grep *.test
ls | grep '.*.test'

zzw 回复

多谢了,不过第一个试了一下直接*.test是不可以的,后面一个可以

28Floor has been deleted
29Floor has been deleted
jiaxiong 回复

尴尬了😂 我Ubuntu上是可以的啊!

grep测试题
找出nginx.log中所有404和503报错的log数据,取出前3条数据,把命令贴到回复里

方法1cat nginx.log | grep -E -m3  'HTTP/1.1" 404|HTTP/1.1" 503'
方法2cat nginx.log | awk '$9==404||$9==503{print $0}' | head -3
方法3cat nginx.log | awk '{print $9}'| grep -E "404|503" | head -3

找出404和500的数据,只打印状态码这一列,然后排序去重

cat nginx.log | awk '$9~/404|500/{print $9}' | sort | uniq -c

对所有404 500 的数据,统计出现这种状态码的url,需要对url汇总(汇总相似的url,把相同的资源但是变化的id去掉)去重,打印前5个出问题的路径

cat nginx.log | awk '$9~/404|500/{print $7}' | sed 's/[0-9]\{1,\}/*/g'|sort | uniq -c | sort -nr| head -5
需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up