首页 > 系统 > Linux > 正文

linux文本分析awk基础命令介绍(8)

2019-10-26 18:50:06
字体:
来源:转载
供稿:网友

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.txt58 c.txt12 d.txt0 e.txt0 f.txt24 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/passwdroot:x:0:0:root:/root:/bin/bashbin: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: 1500ens33: 1500lo:   65536[root@idc-v-71253 ~]# #这里的正则表示不以空白字符开头的行,输出内容中使用/t进行了格式化。

以上所说的NR、NF等都是awk的内建变量,下面列出部分常用内置变量

$0     当前记录(这个变量中存放着整个行的内容)$1~$n    当前记录的第n个字段,字段间由FS分隔FS     输入字段分隔符 默认是空格或TabNF     当前记录中的字段个数,就是有多少列NR     行号,从1开始,如果有多个文件话,这个值也不断累加。FNR     输入文件行号RS     输入的记录分隔符, 默认为换行符OFS     输出字段分隔符, 默认也是空格ORS     输出的记录分隔符,默认为换行符FILENAME  当前输入文件的名字            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表