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 相关常用命令的主要内容,如果未能解决你的问题,请参考以下文章