awk命令
该命令工具扫描文件中的每一行,查找与命令行中所给定内容相匹配的模式。如果发现匹配内容,则进行下一个编程步骤。如果找不到匹配内容,则继续处理下一行。
语法:
awk [option] 'pattern{action}' file...
awk [选项] '模式{动作}' 文件...
options 表示选项参数,pattern 表示模式,action 指的是动作,awk擅长文本格式且输出格式化的结果,因此最常用的动作就是print。
常见的选项有:
-F 指定分割符,不指定默认以空格分割,示例: awk -F ':' '{print $1}' file.txt (或awk -F: '{ print $1 }' /etc/passwd) 使用-F 指定分隔符为冒号
模式:
模式其实就表示条件,表示当满足什么条件后做对应的action动作
NR==2 表示取第2行
常用的动作有:
print :表示输出打印,示例: awk '{print $1}' file.txt # action为print,表示打印第1个变量值
awk命令也是按行处理文件的,一行处理完毕接着处理下一行,awk会根据用户指定的分隔符进行工作,没有
指定分隔符默认以空格进行分割,awk把每一行分割后的数据对应到内置的变量中。
常用的内置变量:
$0 :表示分割符分割后的全部列,其实就是一整行
$1 :表示分割符分割后的第1列
$2 :表示分割符分割后的第2列
......同理
NF(Number of fields) 分割后,字段总数,字段总数应该是一个整数,如 '{print NF }' 打印出7
$NF :表示分割符分割后的最后一列,加上$号取值就表示最后一列了
$(NF-1) :表示分割符分割后的倒数第二列
$(NF-2) :表示分割符分割后的倒数第三列
......同理
NR(Number of records):当前行数,行号,通常在模式中使用,如 NR==2表示第2行
演示示例:
[root@master ~]# cat /etc/passwd > file.txt #以passwd为例子
[root@master ~]# awk -F ':' '{print $0}' file.txt #指定分割符是冒号,输出全部列,其实就是一整行
[root@master ~]# awk -F ':' '{print}' file.txt #等价于上一行
[root@master ~]# awk -F ':' '{print $1}' file.txt #指定分割符是冒号,输出打印第1列
[root@master ~]# awk -F ':' '{print $1 $2}' file.txt #指定分割符是冒号,输出打印第1列和第2列,但是第1列和第2列连在一起了
rootx
binx
daemonx
.....
[root@master ~]# awk -F ':' '{print $1,$2}' file.txt #第1列和第2列加一个逗号,输出显示会默认空格隔间
[root@master ~]# awk -F ':' '{print "first:",$1,"----","secods:",$2}' file.txt #print可以加格式化输出,但要使用双引号括起来
[root@master ~]# awk -F ':' '{print $NF}' file.txt # $NF表示最后一列
[root@master ~]# awk -F ':' '{print $(NF-1)}' file.txt # $(NF-1)表示倒数第2列
[root@master ~]# awk -F ':' 'NR==5{print $1}' file.txt #表示awk找到第5行,输出打印 第1列
[root@master ~]# awk -F ':' 'NR==1,NR==5{print $1}' file.txt #这是表示awk找到第1到第5行,输出打印 第1列
[root@master ~]# awk -F ':' '{print NR,$0}' file.txt #NR就是行号,输出打印全部行并带行号