Linux根据关键字过滤日志记录命令总结

引言

Linux日志中存储了大量信息,但是在于如何快速提取信息。可以使用许多工具来执行此操作,从命令行工具到更多工具先进的分析工具能够搜索特定字段,计算汇总,生成图表等。本篇主要想集中于awk、grep、sed三种查询方式进行总结。

awk命令解析

awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。

  • FS :输入字段分隔符,默认为空白字符
  • OFS :输出字段分隔符,默认为空白字符
  • RS :输入记录分隔符,指定输入时的换行符,原换行符仍有效
  • ORS :输出记录分隔符,输出时用指定符号代替换行符
  • NF :字段数量,共有多少字段, N F 引 用 最 后 一 列 , NF引用最后一列, NF(NF-1)引用倒数第2列
  • NR :行号,后可跟多个文件,第二个文件行号继续从第一个文件最后行号开始
  • FNR :各文件分别计数, 行号,后跟一个文件和NR一样,跟多个文件,第二个文件行号从1开始
  • FILENAME :当前文件名
  • ARGC :命令行参数的个数
  • ARGV :数组,保存的是命令行所给定的各参数,查看参数

那么如下就是我做的实验情况:

[root@VM-0-11-centos software]# cat text.log 
2021-01-21 18:11:37 FrameStore INFO - check calc time:840187c5-432e-11eb-b3b1-0242ac1b0004 1107 1116 1611223897.2701166
2021-01-22 18:12:37 FrameStore INFO - check calc time:c379c04f-f677-11ea-8643-0242ac110002 243 252 1611223897.3986614
2021-01-23 18:13:37 FrameStore INFO - check calc time:203d164b-4330-11eb-b3b1-0242ac1b0004 1017 1026 1611223897.5125592
2021-01-24 18:14:37 FrameStore INFO - check calc time:840187c5-432e-11eb-b3b1-0242ac1b0004 1116 1125 1611223897.6267443

[root@VM-0-11-centos software]# awk -v FS=':' '{print $1,$2}' text.log	# FS指定输入分隔符
2021-01-21 18 11
2021-01-22 18 12
2021-01-23 18 13
2021-01-24 18 14
[root@VM-0-11-centos software]# awk -v FS=':' -v OFS='---' '{print $1,$2}' text.log   # OFS指定输出分隔符
2021-01-21 18---11
2021-01-22 18---12
2021-01-23 18---13
2021-01-24 18---14
[root@VM-0-11-centos software]# awk -v RS=':' '{print $1,$2}' text.log
2021-01-21 18
11
37 FrameStore
840187c5-432e-11eb-b3b1-0242ac1b0004 1107
12
37 FrameStore
c379c04f-f677-11ea-8643-0242ac110002 243
13
37 FrameStore
203d164b-4330-11eb-b3b1-0242ac1b0004 1017
14
37 FrameStore
840187c5-432e-11eb-b3b1-0242ac1b0004 1116

[root@VM-0-11-centos software]# awk -F: '{print NF}' text.log		# 显示每行有多少字段
4
4
4
4
[root@VM-0-11-centos software]# awk -F: '{print $NF}' text.log		# 将每行第NF个字段的值打印出来
840187c5-432e-11eb-b3b1-0242ac1b0004 1107 1116 1611223897.2701166
c379c04f-f677-11ea-8643-0242ac110002 243 252 1611223897.3986614
203d164b-4330-11eb-b3b1-0242ac1b0004 1017 1026 1611223897.5125592
840187c5-432e-11eb-b3b1-0242ac1b0004 1116 1125 1611223897.6267443
[root@VM-0-11-centos software]# awk -F: 'NF==4 {print }' text.log	# 显示只有4个字段的行
2021-01-21 18:11:37 FrameStore INFO - check calc time:840187c5-432e-11eb-b3b1-02                                                                       42ac1b0004 1107 1116 1611223897.2701166
2021-01-22 18:12:37 FrameStore INFO - check calc time:c379c04f-f677-11ea-8643-02                                                                       42ac110002 243 252 1611223897.3986614
2021-01-23 18:13:37 FrameStore INFO - check calc time:203d164b-4330-11eb-b3b1-02                                                                       42ac1b0004 1017 1026 1611223897.5125592
2021-01-24 18:14:37 FrameStore INFO - check calc time:840187c5-432e-11eb-b3b1-02                                                                       42ac1b0004 1116 1125 1611223897.6267443
[root@VM-0-11-centos software]# awk -F: 'NF<=3 {print }' text.log	# 显示小于等于3个字段的行
[root@VM-0-11-centos software]# awk -F: 'NF<=2{print $0}' text.log	# 显示每行字段数量小于2的行
[root@VM-0-11-centos software]# awk '{print NR,$0}' text.log		# 输出每行的行号
1 2021-01-21 18:11:37 FrameStore INFO - check calc time:840187c5-432e-11eb-b3b1-0242ac1b0004 1107 1116 1611223897.2701166
2 2021-01-22 18:12:37 FrameStore INFO - check calc time:c379c04f-f677-11ea-8643-0242ac110002 243 252 1611223897.3986614
3 2021-01-23 18:13:37 FrameStore INFO - check calc time:203d164b-4330-11eb-b3b1-0242ac1b0004 1017 1026 1611223897.5125592
4 2021-01-24 18:14:37 FrameStore INFO - check calc time:840187c5-432e-11eb-b3b1-0242ac1b0004 1116 1125 1611223897.6267443

一般用awk查询日志的时候都是去对日志中出现最多的IP,或者某个变量做统计进行使用,参考Linux awk统计日志中出现过的IP(或出现次数最多的N个IP):

awk '{a[$1] += 1;} END {for (i in a) printf("%d %s\n", a[i], i);}' 日志文件 | sort -n | tail -n 10 #用tail显示最后10行

netstat -ntu |awk '{print $5}' |sort | uniq -c| sort -nr	# 当前WEB服务器中联接次数最多的ip地址

cat access_log |cut -d ' ' -f 1 | sort |uniq -c | sort -nr | awk '{print $0 }' | head -n 10 | less	# 查看日志中访问次数最多的前10个IP

cat access_log | grep '12/Aug/2009' | grep '/images/index/e1.gif' | wc | awk '{print $1}'		# 统计某url,一天的访问次数

sed命令解析

sed 是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(patternspace),接着用sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环。如果没有使诸如‘D’ 的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出或-i。

命令格式为:

sed [options] '[地址定界] command' file(s)

常用选项为:

  • -n:不输出模式空间内容到屏幕,即不自动打印,只打印匹配到的行
  • -e:多点编辑,对每行处理时,可以有多个Script
  • -f:把Script写到文件当中,在执行sed时-f 指定文件路径,如果是多个Script,换行写
  • -r:支持扩展的正则表达式
  • -i:直接将处理的结果写入文件
  • -i.bak:在将处理的结果写入文件之前备份一份
[root@VM-0-11-centos software]# sed -r 's/[0-9]//g;s/^( )+//' text.log		# 删除所有数字、行首空格
-- :: FrameStore INFO - check calc time:c-e-eb-bb-acb   .
-- :: FrameStore INFO - check calc time:ccf-f-ea--ac   .
-- :: FrameStore INFO - check calc time:db--eb-bb-acb   .
-- :: FrameStore INFO - check calc time:c-e-eb-bb-acb   .

[root@VM-0-11-centos software]# seq 9 | sed 'N;D' text.log		# 查看日志最后一行
2021-01-24 18:14:37 FrameStore INFO - check calc time:840187c5-432e-11eb-b3b1-0242ac1b0004 1116 1125 1611223897.6267443

$ sed '2,$d' file	# 删除文件的第2行到末尾所有行:
$ sed '$d' file		# 删除文件最后一行
$ sed '/^test/'d file	# 删除所有文件中开头是test的行
$ sed 's/^192.168.0.1/&localhost/' file 192.168.0.1localhost		# 所有以以192.168.0.1开头的行都会被替换成它自已加localhost

sed之后有做其它操作后续补充,这里重点想说明一下grep:

grep命令解析

Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来(匹配到的标红)。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

对日志记录做多次grep过滤输出,格式如下:

tail -f log | grep xxx | grep yyy

关于grep的管道 | 是全缓冲的,一般来说buffer_size为4096,有些是8192。不管具体值多少,只有buffer_size满了,才会看到输出。
在操作里 >>file 这个操作也是全缓冲的。所以如果没有结果输出,调整如下:

tail -f log | grep --line-buffer xxx | grep --line-buffer yyy

那么简单的使用情况如下:


而如果想要深入,以及工作中常用到的命令为:



参考文献:

[1].Linux文本三剑客超详细教程—grep、sed、awk

[1].Linux awk统计日志中出现过的IP(或出现次数最多的N个IP)

你可能感兴趣的:(Linux,python,linux,shell)