awk是一款文本分析工具awk相对于grep、sed来说显得尤为强大,awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息。
awk内置变量
ARGC 命令行参数个数``ARGV 命令行参数排列``ENVIRON 支持队列中系统环境变量的使用``FILENAME ``awk``浏览的文件名``FNR 浏览文件的记录数``FS 设置输入域分隔符,等价于命令行 -F选项``NF 浏览记录的域的个数``NR 已读的记录数``OFS 输出域分隔符``ORS 输出记录分隔符``RS 控制记录分隔符``$0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域,......以此类推。 $NF是number finally,表示最后一列的信息,跟变量NF是有区别的,变量NF统计的是每行列的总数
常用的命令展示
awk擅长列输出
搜索/etc/passwd有root关键字的所有行
awk` `'/root/'` `/etc/passwd` `【这种是pattern的使用,匹配了pattern(这里是root)的行才会执行action(没有指定action,默认输出每行的内容)】
搜索/etc/passwd有root关键字的所有行,并显示对应的shell
awk` `-F: ``'/root/ {print $7}'` `/etc/passwd
统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:
awk` `-F ``':'` `'{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}'` `/etc/passwd
使用printf替代print,可以让代码更加简洁,易读
awk` `-F: ``'{printf ("filename:%10s, linenumber:%3s,column:%3s,content:%3f\n",FILENAME,NR,NF,$0)}'` `/etc/passwd
打印/etc/passwd/的第二行信息
awk` `-F: ``'NR==2{print "filename: "FILENAME, $0}'` `/etc/passwd
awk的过滤使用方法
ls` `-lF | ``awk` `'/^d/'
指定特定的分隔符,查询第一列
awk` `-F ``":"` `'{print $1}'` `/etc/passwd
指定特定的分隔符,查询最后一列
awk` `-F ``":"` `'{print $NF}'` `/etc/passwd
指定特定的分隔符,查询倒数第二列
awk` `-F ``":"` `'{print $NF-1}'` `/etc/passwd
获取第12到31行的第一列的信息
awk` `-F ``":"` `'{if(NR12) print $1}'` `/etc/passwd
多分隔符的使用:
[root@localhost ftl]``# awk -F "[/]" 'NR == 4 {print $0,"\n",$1}' /etc/passwd``这里以/为分隔符,多个分隔符利用[]然后在里面写分隔符即可
添加了BEGIN和END
[root@localhost ftl]``# cat /etc/passwd | awk -F: 'BEGIN{print "name, shell"} {print $1,$NF} END{print "hello world"}'
查看最近登录最多的IP信息
[root@localhost ftl]``# last | awk '{S[$3]++} END{for(a in S ) {print S[a],a}}' |uniq| sort -rh
利用正则过滤多个空格
[root@localhost ~]``# ifconfig |grep eth* | awk -F '[ ]+' '{print $1}'
awk编程–变量和赋值
除了awk的内置变量,awk还可以自定义变量, awk中的循环语句同样借鉴于C语言,支持while、do/while、for、break、continue,这些关键字的语义和C语言中的语义完全相同。
统计某个文件夹下的大于100k文件的数量和总和
ls` `-l|``awk` `'{if($5>100){count++; sum+=$5}} {print "Count:" count,"Sum: " sum}'` `【因为``awk``会轮询统计,所以会显示整个过程】``ls` `-l|``awk` `'{if($5>100){count++; sum+=$5}} END{print "Count:" count,"Sum: " sum}'` `【天界END后只显示最后的结果】 备注:count是自定义变量。之前的action{}里都是只有一个print,其实print只是一个语句,而action{}可以有多个语句,以;号隔开
统计显示/etc/passwd的账户
awk` `-F: ``'{count++;} END{print count}'` `/etc/passwd` `cat` `/etc/passwd``|``wc` `-l``awk` `-F ``':'` `'BEGIN {count=0;} {name[count] = $1;count++;}; END{for (i = 0; i
通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。
以上就是
为各位朋友分享的 相关内容。想要了解更多Linux相关知识记得关注公众号“良许Linux”,或扫描下方二维码进行关注,更多