自从开始用UNIX Pipeline后,感觉查日志速度快了一倍不止。什么是UNIX Pipeline我就不背书了,这里就记录下一些好用的命令吧。
日志示例:
INF [20160215-15:40:52.608] regservice: /alias => {"alias":"13587428", "header":{"name":"XXXX","appkey":"1234567890"}, "token":"abc1234567890"} 1.1.0.0
INF [20160215-15:40:52.608] regservice: /launch => {"header":{"name":"XXXX1","appkey":"1234567891"}, "token":"abc1234567891"} 1.2.0.0
...
grep
not,查找不包含字符串的记录
1 |
grep -v 'appkey1' logs.log |
and,查找满足多个条件的记录
1 |
grep 'appkey1' logs.log|grep 'token1' |
or,查找满足任意一个条件的记录
1 |
grep -E 'appkey1|appkey2' logs.log |
-oP,这个我也不知道如何描述,我的一个常用场景是:根据日志,统计每个appkey下的日志有多少。于是可用下面的记录先选出appkey(appkey长度固定为10位),以供后续处理:
1 |
grep -oP '"appkey":".{10}"' logs.log |
上文中日志示例的结果为:
1 2 3 |
"appkey":"1234567890" "appkey":"1234567891" ... |
sort
sort一般用在2个地方,1是在uniq之前,将记录排序,不然uniq结果会出现各种重复;2就是排序,如:
1 |
grep -oP '"appkey":".{10}"' logs.log|sort|uniq -c|sort -k 1 -n -r |
上面第一次用sort就是第一种用法。第二次用sort为第二种用法。常用参数有-k,指定排序列,从1开始;-n,将默认的字段序变为数字顺序;-r,升序变降序。
uniq
一般都加上参数-c,统计次数。
1 |
grep -oP '"appkey":".{10}"' logs.log|sort|uniq -c |
如上面命令的结果可能为:
1 2 3 |
198 "appkey":"1234567890" 100 "appkey":"1234567891" ... |
wc
统计行数。
1 |
grep 'appkey1' logs.log|wc -l |
awk
详见AWK 简明教程
示例,以冒号(:)为分隔符,选取第一列字符串大于等于
1 |
awk 'BEGIN{FS=":"} $1>="[2015-12-15" && $1<="[2016-01-05" {print $1,$3}' logs.log |
sed
详见sed 简明教程
示例,删除记录前面的
1 |
grep -oP '"appkey":".{10}"' logs.log|sed 's/^"appkey":"//;s/"$//' |
head
取前n行
1 |
head -n 10000 logs.log |
tail
取后n行
1 |
tail -n 10000 logs.log |
持续查看追加到文件末尾的内容
1 |
tail -f logs.log |
cat & tac
顺序 & 倒叙输出文本
xargs
目前就会用-i参数,意思是可以用{}来代替每个输入。如下,id.txt存放的是所有的主键,一行一个。
1 |
cat id.txt | xargs -i mysql -e 'select * from test where id={}' |
cut
常用参数-c,应该意思是按char截取;-d,指定分隔符,和awk类似。下例意思就是取每行的第10个到行尾的字符:
1 |
cut -c 10- test.txt |
join
-a1,-a2等,意思输出第一个、第二个文件的全部field;-o "1.1,2.1,2.2",意思是输出第一个文件的第一个field,第二个文件的第一个和第二个field;-e,join不到的输出字符,可以设置为-e "NULL"。
1 |
join -11 -21 -a1 -a2 -o "1.1,1.2,2.1,2.2,2.3,2.4,2.5,2.6,2.7" -e NULL app.txt other.txt |
1个示例
看懂就可以干后端啦!
1 |
grep 'SUCCEEDED' /home/root/log/reader-log4j.log|awk '$1>="[2015-12-15" && $1<="[2016-01-05"'|awk '{print $9}'|sort|uniq -c|sort -k 1 -n -r|awk 'BEGIN{FS=","} {print $1,$3}'|awk 'BEGIN{OFS="\t"} $1>20 {print $2,$3,$1}'|sed 's/.et2.tbsite.net//g' |