Linux Linux 三剑客

思寒_seveniruby · 2019年01月24日 · 最后由 羽桃儿 回复于 2020年12月04日 · 3307 次阅读

环境

  • 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 个出问题的路径,把命令贴到回复里

演练

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

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
5楼 已删除

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}'

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

匿名 · #20 · 2019年01月25日
僅樓主可見
小九 回复

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

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

明白了,谢谢

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

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

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

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

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

zzw 回复

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

28楼 已删除
29楼 已删除
jiaxiong 回复

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

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

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

找出 nginx.log 中所有 404 和 503 报错的 log 数据,取出前 3 条数据
cat nginx.log | awk '$9==404||$9==503' | head -3
找出 testerhome 首页的所有 http 和 https 的链接
curl https://testerhome.com | grep -o -E "(http|https)://[a-zA-Z0-9/.]*"

需要 登录 後方可回應,如果你還沒有帳號按這裡 注册