在我们的日常开发中,经常需要对日志进行查询、排序、聚合等操作来拿到我们想要的数据。下面通过一些实际遇到的例子来学习Linux中的awk、grep、sort、uniq、tail、cat、less等命令的使用。
案例一:如何在日志中查询包含某些关键词的信息
cat or tail + grep
1.1 最基本的使用
为在app.log文件中查询包含关键词keyword的行
cat app.log | grep "keyword"
如果是一个还在滚动增长的日志,要在最新的内容搜索,可以把cat命令替换为tail -f。下面的同理,不在重复说明了。
tail -f app.log | grep "keyword"
1.2 查询包含keyword1 或者keyword2的行
cat app.log | grep "key1\|key2"
多个关键词之间使用|隔开
1.3 排除包含key3的行
cat app.log | grep -v "key3"
1.4 排除包含key3、key4的行
cat app.log | grep -v "key3" | grep -v "key4"
是的可以链式使用同一命令。
1.5 搜索包含key1或者key2且不包含key3的行
cat app.log | grep "key1/|key2" | grep -v "key3"
1.6 输出满足条件的前100条数据
如果搜索结果太多,看不过来怎么办?可以只输出前n条满足条件的行。
cat app.log | grep "key1" -m 100
1.7 输出满足条件的行的前、后n行
输出包含key1的行,和它前10行输出
cat app.log | grep "key1" -B 10
输出包含key1的行,和它后10行输出
cat app.log | grep "key1" -A 10
输出包含key1的行,和它前后10行输出
cat app.log | grep "key1" -C 10
案例二:将一行数据分割后进行查询
在 很多情况下,一行日志中包含很多信息,这些信息以空格或其他符号分隔开。这就需要我们进行分割后处理。使用强大的awk命令可以完成这种操作。
假设日志格式如下:
即每行数据包含3个字段:编号、url、IP地址,字段之间使用空格隔开
000001 baidu.com/hello.html 123.1.1.1
000002 baidu.com/world.html 124.1.1.1
2.1 输出分割之后的第n项
输出第一项:
cat app.log | awk -F ' ' '{print $1}'
输出最后一项:
cat app.log | awk -F ' ' '{print $NF}'
标号从1开始,也可以使用NF表示最后一项。
2.2 如果url中包含hello.html则输出整行
cat test.log | awk -F ' ' '{if(match($2,"hello")>0){print $0}}'
使用match方法进行匹配,并且之前说了分割后从1开始计数,第0项就表示整行数据,这里也可以根据需要选择输出哪一项数据。
案例三.统计access日志中访问量最大的10个IP
cat access.log | grep "list.shtml" | awk -F ' ' '{print $NF}' | sort | uniq -c | sort -k 1 -nr | head -10
命令解释:
grep、awk就不用说了(这里access的最后一项是IP)
sort:排序
uniq -c : 将相邻的、重复项合并并计数
sort -k 1 -nr : -k 1表示按第1项排序(计数值),-n表示按数字排序,加上个r表示你需
案例四.遍历分隔项,输出满足条件的
cat access.log2021-12-13 | grep "info.shtml" -m 1000 | awk -F '&' '{for(i=1;i<=NF;i++){if(!match($i,"id=")) print $0}}'