AWK也是一个很强大的文本处理工具,与grep, sed 一起称为linux文本处理的“三板斧”。
- grep更适合单纯的查找和匹配文本
- sed适合编辑匹配的文本
- awk适合格式化文本,倾向于把一行文本分成多个‘字段’来进行复杂的格式化操作。
如图,awk是逐行处理文本,将一行内容按照指定分隔符将行分割为多个字段,其中分割完后第一个字段为:$1
,第二个为$2
。 $0
表示当前处理的整行。
除此之外,awk还有一些特殊的内置变量:
- NF ,表示每一行(
$0
)有的字段总数,(注:$NF
与NF
不一样,$NF
指的是当前行的最后一个字段) - NR ,表示当前处理的是第几行
- FS ,表示目前的分隔符,默认是空格
1.语法
awk [option] ‘partten1 {action1}; partten2 {action2}‘
匹配条件和动作 [‘partten1 {action1}‘]
partten表示匹配的条件,action 表示对符合条件的内容进行的操作,常用动作有printf,用于格式化输出。
注意:
- partten和action外要用单引号‘‘括起来,action要用花括号{}括起来,
- 单引号内如果有字符串,必须使用双引号""括起来。
常用参数 [option]
-
-F
指定分隔符 ,如awk -F, ‘{print $1,$2}
‘ -
-v
定义变量 ,如awk -va=1,‘{print $a+1}
‘ -
-f
从脚本中读取awk命令
2.实例
(1) 无匹配条件
- 每行按空格分割,输出第1列和第3列
-
awk ‘{print $1,$3}‘
注:多个变量之间用逗号,隔开。
- 每行按逗号分割,输出第1列和第3列
awk -F, ‘{print $1,$3}‘
- 加上变量的格式化输出
awk -va=1, ‘{print $1+a,$3}‘
(2) 有匹配条件
- 指定分隔符,且输出第3列<10的第一列和第三列字段,并用空格隔开。
awk ‘{FS=":"} $3 < 10 {print $1 "\t" $3}‘
- 带有计算的命令
-
awk ‘NR==1{pintf $1,$2,"total"};NR>=2{total = $1+$2 print $1,$2,total}‘
注:
多个命令可用分号;间隔或者使用换行[ENTER]键隔开。
变量可以直接使用,不需要加$
- 带有BEGIN和END两种模式的
BEGIN 表示指定处理文本之前需要执行的操作。
END 表示指定处理本文之后需要指定的操作。
比如,在打印某个文件前先打印‘aaa,bbb‘
awk ‘BEGIN{print "aaa","bbb"}{print $1,$2}‘ file.txt