linux 查日志神器 - awk 相关常用命令

Posted 栗子~~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux 查日志神器 - awk 相关常用命令相关的知识,希望对你有一定的参考价值。

文章目录

前言

  如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
  而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!


linux 查日志神器 - awk 相关常用命令

常用命令选项

-F fs fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:,默认的分隔符是连续的空格或制表符
-v var=value 赋值一个用户定义变量,将外部变量传递给awk
-f scripfile 从脚本文件中读取awk命令
-m[fr] val 对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。

awk内置变量

$n 当前记录的第n个字段,比如n为1表示第一个字段,n为2表示第二个字段。
$0 这个变量包含执行过程中当前行的文本内容。
[N] ARGC 命令行参数的数目。
[G] ARGIND 命令行中当前文件的位置(从0开始算)。
[N] ARGV 包含命令行参数的数组。
[G] CONVFMT 数字转换格式(默认值为%.6g)。
[P] ENVIRON 环境变量关联数组。
[N] ERRNO 最后一个系统错误的描述。
[G] FIELDWIDTHS 字段宽度列表(用空格键分隔)。
[A] FILENAME 当前输入文件的名。
[P] FNR 同NR,但相对于当前文件。
[A] FS 字段分隔符(默认是任何空格)。
[G] IGNORECASE 如果为真,则进行忽略大小写的匹配。
[A] NF 表示字段数,在执行过程中对应于当前的字段数。
[A] NR 表示记录数,在执行过程中对应于当前的行号。
[A] OFMT 数字的输出格式(默认值是%.6g)。
[A] OFS 输出字段分隔符(默认值是一个空格)。
[A] ORS 输出记录分隔符(默认值是一个换行符)。
[A] RS 记录分隔符(默认是一个换行符)。
[N] RSTART 由match函数所匹配的字符串的第一个位置。
[N] RLENGTH 由match函数所匹配的字符串的长度。
[N] SUBSEP 数组下标分隔符(默认值是34)。

01 默认打印所有行

awk 'print' ifcfg-ens33

02 与grep过滤联用

grep “过滤内容” 文件 | awk ‘print’
示例:

grep "IPV6" ifcfg-ens33 | awk 'print'

03 除了print 默认的行为,我们也可以将一行 split 成多个 field,根据所需进行打印

grep “过滤内容” 文件 | awk -F 拆分依据 ‘print $拆分游标’
示例:

grep "IPV6" ifcfg-ens33 | awk -F = 'print $0'

说明: 查询ifcfg-ens33里面过滤"IPV6"后的数据,并以"="拆分成数组data ,打印data.toString()

grep "IPV6" ifcfg-ens33 | awk -F = 'print $1'

说明: 查询ifcfg-ens33里面过滤"IPV6"后的数据,并以"="拆分成数组data ,打印data[0]

grep "IPV6" ifcfg-ens33 | awk -F = 'print $2'

说明: 查询ifcfg-ens33里面过滤"IPV6"后的数据,并以"="拆分成数组data ,打印data[1]

grep "IPV6" ifcfg-ens33 | awk -F = 'print $1,$2'

说明: 查询ifcfg-ens33里面过滤"IPV6"后的数据,并以"="拆分成数组data ,打印data[0]与data[1]

04 使用 NR 命令来输出指定行

示例:
首先第一步添加行号

grep "IPV6" ifcfg-ens33 | awk -F = 'print NR,$1'

说明: 查询ifcfg-ens33里面过滤"IPV6"后的数据,并以"="拆分成数组data ,打印行号 +data[0]


也可以这样

grep "IPV6" ifcfg-ens33 | awk -F = 'print NR "-" $1'

说明: 查询ifcfg-ens33里面过滤"IPV6"后的数据,并以"="拆分成数组data ,打印行号 -data[0]

第二步:指定行号进行输出

grep "IPV6" ifcfg-ens33 | awk -F = ' NR==2,NR==4 print NR "-" $1'

说明: 查询ifcfg-ens33里面过滤"IPV6"后的数据,并以"="拆分成数组data ,打印行号为2到4区间的数据(行号 -data[0])


或者输出第三号的数据

grep "IPV6" ifcfg-ens33 | awk -F = ' NR==3 print NR "-" $1'

05 获取查询出来的总数-END

grep "IPV6" ifcfg-ens33 | awk -F = ' END  print NR'

其实这里边的END的意思是打印最后一行,因为在这里我们进行了行号关联,因此也可以表示查询的数量;

06 $NF 命令- 表示最后一列

验证:

grep "IPV6" ifcfg-ens33 | awk -F = ' print NR "-" $0'

等于

grep "IPV6" ifcfg-ens33 | awk -F = ' print NR "-" $1,$NF'

07 awk -length函数计算字符串长度

示例:

grep "IPV6" ifcfg-ens33 | awk -F = ' print NR "-" $0'

说明: 查询ifcfg-ens33里面过滤"IPV6"后的数据,并以"=“拆分成数组data ,打印"行号-data.toString()”

grep "IPV6" ifcfg-ens33 | awk -F = 'length($0) >20 print NR "-" $0'

说明: 查询ifcfg-ens33里面过滤"IPV6"后的数据,并以"="拆分成数组data ,打印字符串长度大于20的数据【行号-data.toString()】

08 awk-if 函数判断打印

示例:

grep "IPV6" ifcfg-ens33 | awk -F = ' print NR "-" $0'

说明: 查询ifcfg-ens33里面过滤"IPV6"后的数据,并以"=“拆分成数组data ,打印"行号-data.toString()”

grep "IPV6" ifcfg-ens33 | awk -F = ' if($2 == "yes") print NR "-" $0'

说明: 查询ifcfg-ens33里面过滤"IPV6"后的数据,并以"="拆分成数组data ,只打印data[1]==yes的数据【“行号-data.toString()”】

09 awk + uniq 显示或忽略重复的行

grep "IPV6" ifcfg-ens33 | awk -F = ' print  $2'| uniq -c

10 awk + sort

排序选项:

-b, --ignore-leading-blanks 忽略开头的空白。
-d, --dictionary-order 仅考虑空白、字母、数字。
-f, --ignore-case 将小写字母作为大写字母考虑。
-g, --general-numeric-sort 根据数字排序。
-i, --ignore-nonprinting 排除不可打印字符。
-M, --month-sort 按照非月份、一月、十二月的顺序排序。
-h, --human-numeric-sort 根据存储容量排序(注意使用大写字母,例如:2K 1G)。
-n, --numeric-sort 根据数字排序。
-R, --random-sort 随机排序,但分组相同的行。
–random-source=FILE 从FILE中获取随机长度的字节。
-r, --reverse 将结果倒序排列。
–sort=WORD 根据WORD排序,其中: general-numeric 等价于 -g,human-numeric 等价于 -h,month 等价于 -M,numeric 等价于 -n,random 等价于 -R,version 等价于 -V。
-V, --version-sort 文本中(版本)数字的自然排序。

grep "IPV6" ifcfg-ens33 | awk -F = ' print  $2'| uniq -c |  sort -rn

以上是关于linux 查日志神器 - awk 相关常用命令的主要内容,如果未能解决你的问题,请参考以下文章

linux 查日志神器 - awk 相关常用命令

Linux日志分析常用命令汇总

linux常用过滤日志命令

linux运维之分析日志相关命令

我试了试用 SQL查 Linux日志,好用到飞起

Linux-命令神器 man info 与 whatis