作为运维,日常工作中难免会查看日志去分析问题,但是当我们遇到一个超级大的日志文件时,如何检索出自己需要的内容就显得尤为重要,以下是我日常使用最频繁的一些指令,旨在基础,一些高阶的用法并没有列出来,欢迎各位大哥补充,共同学习,共同进步。
#按照关键字查询相关日志并打印该行前后10行内容
cat output.log | grep -C 10 'keyword'
grep -C 10 'keyword' output.log
#按照关键字查询相关日志并打印前面的10行内容
cat output.log | grep -A 10 'keyword'
grep -A 10 'keyword' output.log
#按照关键字查询相关日志并打印后面的10行内容
cat output.log | grep -B 10 'keyword'
grep -B 10 'keyword' output.log
#统计文件中查询到的关键字个数
grep -c 'keyword' output.log
#如果grep出现报错 grep: -C: invalid context length argument,说明该文件是二进制文件
这种情况一般加一个-a的参数即可
cat output.log | grep -a -C 10 'keyword'
#按时间段查询日志,查询2024-02-22 03:38到04:00之间的日志
cat output.log | sed -n '/2024-02-22 03:28/,/2024-02-22 04:00/p'
#这里有一个需要注意的地方,如果开始时间没有日志,那么查询结果会为空,所以还可以使用模糊查询的方法
sed -n '/2024-02-22 03:28:*/,/2024-02-22 04:00:*/p'
#正则查询
sed -n '/^2024-02-22 03:28:[0-5][0-9]/,/^2024-02-22 04:00[0-5][0-9]/p' output.log
#grep忽略大小写的用法
grep -i 'keyword' output.log
#反向匹配,查询不包含某关键字的行
grep -v 'error' output.log
#行号显示
grep -n '关键字' output.log
#递归查询,需要在目录及子目录中递归查询文件,结果展示匹配行文件名+匹配行
grep -r 'keyword' logs/
#使用sed查询关键字
sed -n '/error/p' output.log
#awk的用法 awk通常用来处理字段,并基于字段进行过滤或者模式匹配
语法:
awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)
#用法:输出字段(列),换句话说就是输出第一列和第四列
awk '{print $1,$4}' output.log
#例如打印服务器上运行的java进程的用户和进程ID
ps -ef | grep java | awk '{print $1,$2}'
root 4194
root 7961
root 27262
#打印nginx日志中访问的IP,统计次数并按需排列
awk '{print $1}' access.log | sort | uniq -c | sort -nr | wc -l
sort:提取的IP进行排序
uniq -c:统计每个IP出现的次数
sort -nr:按照计数值进行逆向排序
#查看访问最频繁的10个IP
awk '{print $1}' access.log | sort -n |uniq -c | sort -rn | head -n 10
#统计nginx日志中request_times的值即统计响应时间并排列,这样我们就能找到响应时间最长的然后定位到行便于排查
awk -F '"request_times:"' '{print NR, $2}' access.log | sort -n -k 2
-F 用于指定字段分隔符为 "request_times:"
'{print NR, $2}' 会输出行号 (NR) 和第二个字段,即 "request_times" 后面的值
sort -n -k 2 用于按照第二个字段(即 request_times 的值)进行数值排序
#根据时间段筛选
grep '2024-02-22 03:28:*/' access.log | awk -F '"request_times:"' '{print NR, $2}' access.log | sort -n -k 2
#查看指定行并输出某个字段。查看access.log文件的第6行到第7行,并输出第一个字段
awk '{if(NR>=7 && NR<=8) print $1}' access.log