In addition to Weibo, there is also WeChat
Please pay attention
WeChat public account
Shulou
2025-01-16 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Servers >
Share
Shulou(Shulou.com)06/01 Report--
这篇文章主要介绍Linux中文本分析awk命令怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
awk是一种模式扫描和处理语言,在对数据进行分析处理时,是十分强大的工具。
awk [options] 'pattern {action}' file...
awk的工作过程是这样的:按行读取输入(标准输入或文件),对于符合模式pattern的行,执行action。当pattern省略时表示匹配任何字符串;当action省略时表示执行'{print}';它们不可以同时省略。
每一行输入,对awk来说都是一条记录(record),awk使用$0来引用当前记录:
[root@centos7 ~]# head -1 /etc/passwd | awk '{print $0}' root:x:0:0:root:/root:/bin/bash
例子中将命令head -1 /etc/passwd作为awk的输入,awk省略了pattern,action为print $0,意为打印当前记录。
对于每条记录,awk使用分隔符将其分割成列,***列用$1表示,第二列用$2表示...***一列用$NF表示
选项-F表示指定分隔符
如输出文件/etc/passwd***行***列(用户名)和***一列(登录shell):
[root@centos7 ~]# head -1 /etc/passwd | awk -F: '{print $1,$NF}' root /bin/bash
当没有指定分隔符时,使用一到多个blank(空白字符,由空格键或TAB键产生)作为分隔符。输出的分隔符默认为空格。
如输出命令ls -l *的结果中,文件大小和文件名:
[root@centos7 temp]# ls -l * | awk '{print $5,$NF}' 13 b.txt 58 c.txt 12 d.txt 0 e.txt 0 f.txt 24 test.sh [root@centos7 temp]#
还可以对任意列进行过滤:
[root@centos7 temp]# ls -l *|awk '$5>20 && $NF ~ /txt$/' -rw-r--r-- 1 nobody nobody 58 11月 16 16:34 c.txt
其中$5>20表示第五列的值大于20;&&表示逻辑与;$NF ~ /txt$/中,~表示匹配,符号//内部是正则表达式。这里省略了action,整条awk语句表示打印文件大小大于20字节并且文件名以txt结尾的行。
awk用NR表示行号
[root@centos7 temp]# awk '/^root/ || NR==2' /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin [root@centos7 temp]#
例子中||表示逻辑或,语句表示:输出文件/etc/passwd中以root开头的行或者第二行。
在一些情况下,使用awk过滤甚至比使用grep更灵活
如获得ifconfig的输出中网卡名及其对应的mtu值
[root@idc-v-71253 ~]# ifconfig|awk '/^\S/{print $1"\t"$NF}' ens32: 1500 ens33: 1500 lo: 65536 [root@idc-v-71253 ~]# #这里的正则表示不以空白字符开头的行,输出内容中使用\t进行了格式化。
#这里的正则表示不以空白字符开头的行,输出内容中使用\t进行了格式化。
以上所说的NR、NF等都是awk的内建变量,下面列出部分常用内置变量
$0 当前记录(这个变量中存放着整个行的内容) $1~$n 当前记录的第n个字段,字段间由FS分隔 FS 输入字段分隔符 默认是空格或Tab NF 当前记录中的字段个数,就是有多少列 NR 行号,从1开始,如果有多个文件话,这个值也不断累加。 FNR 输入文件行号 RS 输入的记录分隔符, 默认为换行符 OFS 输出字段分隔符, 默认也是空格 ORS 输出的记录分隔符,默认为换行符 FILENAME 当前输入文件的名字
awk中还可以使用自定义变量,如将网卡名赋值给变量a,然后输出网卡名及其对应的RX bytes的值(注意不同模式匹配及其action的写法):
[root@idc-v-71253 ~]# ifconfig|awk '/^\S/{a=$1}/RX p/{print a,$5}' ens32: 999477100 ens33: 1663197120 lo: 0
awk中有两个特殊的pattern:BEGIN和END;它们不会对输入文本进行匹配,BEGIN对应的action部分组合成一个代码块,在任何输入开始之前执行;END对应的action部分组合成一个代码块,在所有输入处理完成之后执行。
#注意类似于C语言的赋值及print函数用法 [root@centos7 temp]# ls -l *|awk 'BEGIN{print "size name\n---------"}$5>20{x+=$5;print $5,$NF}END{print "---------\ntotal",x}' size name --------- 58 c.txt 24 test.sh --------- total 82 [root@centos7 temp]#
awk还支持数组,数组的索引都被视为字符串(即关联数组),可以使用for循环遍历数组元素
如输出文件/etc/passwd中各种登录shell及其总数量
#注意数组赋值及for循环遍历数组的写法 [root@centos7 temp]# awk -F ':' '{a[$NF]++}END{for(i in a) print i,a[i]}' /etc/passwd /bin/sync 1 /bin/bash 2 /sbin/nologin 19 /sbin/halt 1 /sbin/shutdown 1 [root@centos7 temp]#
当然也有if分支语句
#注意大括号是如何界定action块的 [root@centos7 temp]# netstat -antp|awk '{if($6=="LISTEN"){x++}else{y++}}END{print x,y}' 6 3 [root@centos7 temp]#
pattern之间可以用逗号分隔,表示从匹配***个模式开始直到匹配第二个模式
[root@centos7 ~]# awk '/^root/,/^adm/' /etc/passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin
还支持三目操作符pattern1 ? pattern2 : pattern3,表示判断pattern1是否匹配,true则匹配pattern2,false则匹配pattern3,pattern也可以是类似C语言的表达式。
如判断文件/etc/passwd中UID大于500的登录shell是否为/bin/bash,是则输出整行,否则输出UID为0的行:
#注意为避免混淆对目录分隔符进行了转义 [root@centos7 ~]# awk -F: '$3>500?/\/bin\/bash$/:$3==0 {print $0}' /etc/passwd root:x:0:0:root:/root:/bin/bash learner:x:1000:1000::/home/learner:/bin/bash #三目运算符也可以嵌套,例子略
选项-f file表示从file中读取awk指令
#打印斐波那契数列前十项 [root@centos7 temp]# cat test.awk BEGIN{ $1=1 $2=1 OFS="," for(i=3;i和>>将输出保存至文件
#如按***列(IP)分类拆分文件access.log,并保存至ip.txt文件中 [root@centos7 temp]# awk '{print > $1".txt"}' access.log [root@centos7 temp]# ls -l 172.20.71.* -rw-r--r-- 1 root root 5297 11月 22 21:33 172.20.71.38.txt -rw-r--r-- 1 root root 1236 11月 22 21:33 172.20.71.39.txt -rw-r--r-- 1 root root 4533 11月 22 21:33 172.20.71.84.txt -rw-r--r-- 1 root root 2328 11月 22 21:33 172.20.71.85.txt
内建函数
length()获得字符串长度
[root@centos7 temp]# awk -F: '{if(length($1)>=16)print}' /etc/passwd systemd-bus-proxy:x:999:997:systemd Bus Proxy:/:/sbin/nologin [root@centos7 temp]#
split()将字符串按分隔符分隔,并保存至数组
[root@centos7 temp]# head -1 /etc/passwd|awk '{split($0,arr,/:/);for(i=1;i
Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.
Views: 0
*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.
Continue with the installation of the previous hadoop.First, install zookooper1. Decompress zookoope
"Every 5-10 years, there's a rare product, a really special, very unusual product that's the most un
© 2024 shulou.com SLNews company. All rights reserved.