快捷键

awk 是 linux 上用于文本处理的脚本语言,你可以实现:

  • 定义变量
  • 使用字符串和算术运算符
  • 使用控制流程和循环
  • 生成格式化的输出
用法:awk [POSIX 或 GNU 风格选项] [--] '程序' 文件 ...
POSIX 选项:		GNU 长选项:(标准)
	-f 脚本文件		--file=脚本文件
	-F fs			--field-separator=fs
	-v var=val		--assign=var=val

使用变量

  • $0 整行
  • $1 第一列字段
  • $2 第二列字段
  • $n 第 n 列字段

空格或者制表符是默认的列分隔符 可以通过-F 指定分隔符

awk -F: '{print $1}' /etc/passwd

cat /etc/passwd | awk -F: '{print $1}'

使用脚本文件

将 awk 脚本保存在 testfile 文件中

{print $1 " home at " $6}

然后执行文件

awk -F: -f testfile /etc/passwd

预处理和后处理

保存 testfile 如下

BEGIN {
print "Users and thier corresponding home"
print " UserName \t HomePath"
print "___________ \t __________"
FS=":"
}

{
print $1 "  \t  " $6
}

END {
print "The end"
}

执行脚本

awk -f testfile /etc/passwd

内置变量

一些内置变量如下

  • FS 指定 field 段分隔符
  • OFS [Output Filed Separator]输出分隔符
  • ORS [Output Record Separator] 输出行分隔符
  • FIELDWIDTHS 按段长度分割
  • RS [Record Separator]记录分隔符,默认是换行符

指定输出分隔符

awk 'BEGIN{FS=":"; OFS="-"} {print $1,$6,$7}' /etc/passwd

使用长度分割

素材如下,保存为 testrecord:

1235.96521

927-8.3652

36257.8157
awk 'BEGIN{FIELDWIDTHS="3 4 3"}{print $1,$2,$3}' testrecord

输出如下:

123 5.96 521

927 -8.3 652

362 57.8 157

使用 Record Separator 素材如下,保存为 testrecord:

Person Name
123 High Street
(222) 466-1234

Another person
487 High Street
(523) 643-8754
awk 'BEGIN{FS="\n"; RS=""} {print $1,$3}' testrecord

输出如下:

Person Name (222) 466-1234
Another person (523) 643-8754

参考

30 Examples For Awk Command In Text Processing