Awk 是一个灵活的模式匹配、文本处理及面向行的语言。Linux 为我们提供了其实现版本:gwak
。
我们可以使用 awk
或 gawk
命令来演示,awk
是 gawk
的一个软链接:
ll /bin/awk
这里是 gawk
命令的一些常见选项:
选项 | 用途 |
---|---|
-f 程序文件 或 --file 程序文件 |
从文件读取 gawk 执行脚本。 |
-F fs 或 --field-separator fs |
指定预定于变量 FS 的值。以该值作为列的界定符。 |
-v var=val 或 --assign var=val |
分配值 val 到变量 var 。 |
这里是 gawk
命令的一些常见内置变量:
选项 | 用途 |
---|---|
ARGC |
命令参数个数。 |
ARGV |
命令行参数数组。 |
FNR |
当前输入文件的记录个数。 |
FS |
输入内容字段分隔符;默认情况下是一个空格。 |
NF |
输入字段个数。 |
NR |
输入记录个数。 |
OFS |
输出内容字段分隔符;默认情况下是一个空格。 |
ORS |
输出内容记录分隔符;默认情况下是一个新行。 |
RS |
输出内容记录分隔符;默认情况下是一个新行。 |
这里是 gawk
命令的一些模式与行为:
选项 | 用途 |
---|---|
BEGIN |
在起始位置打印一次。 |
END |
在末尾位置打印一次。 |
/regular expression/ |
为每一行内容执行一个正则表达式。 |
relational expression |
在每一行内容执行操作符运算。 |
pattern && pattern or pattern || pattern or ! pattern |
在每一行内容执行逻辑操作。 |
pattern ? pattern : pattern |
在每一行内容执行三目运算。 |
pattern1, pattern2 |
以 pattern1 匹配的行开始直到 pattern2 匹配的行。 |
选项 | 用途 |
---|---|
{} |
括号里为可执行语句。 |
选项 | 用途 |
---|---|
$N |
指向第 N 行字段。 |
++ - |
自增及自减。 |
+ - ~ |
加、减及取反。 |
* / % |
乘、除及取模。 |
space |
字符串拼接。 |
< > <= >= == != |
关系操作符。 |
&& || |
逻辑与及或。 |
?: |
三木运算符。expr1 ? expr2 : expr3。 |
= += -= *= /= %= ^= |
分配。 |
选项 | 用途 |
---|---|
print |
输出当前记录,以内置变量 ORS 定义的值结尾。 |
printf |
输出格式化内容。 |
printf
语句选项 | 用途 |
---|---|
%a , %A |
十六进制浮点数。 |
%c |
单个字符。 |
%d , %i |
十进制数的整数部分。 |
%e , %E |
浮点数。 |
%o |
无符号八进制数。 |
%u |
无符号十进制数。 |
%s |
单字符字符串。 |
%x , %X |
无符号十六进制数。 |
使用 ARGC
变量,我们可以获取命令行参数的个数:
awk 'BEGIN{print ARGC}' # 打印命令行参数个数
使用 ARGV
变量,我们可以获取命令行参数的值:
awk 'BEGIN{print ARGV[0]}' # 打印命令行第一个参数值
awk 'BEGIN{var=123;print var}' # 打印自定义整数变量
我们可以在输出前获取两个变量之和:
awk 'BEGIN{var=123;var2=321;print var+var2}' # 打印两个变量之和
awk 'BEGIN{var="abc";print var}' # 打印自定义字符串变量
Awk 还可以处理输入流的内容:
ll /
ll / | awk '{print $1}'
以及处理文件的内容:
我们准备一些测试内容:
printf '%s\n' \
'user1:10020:10010:Dong Chen:/bin/bash:active' \
'user2:10021:10010:Dong Chen1:/bin/bash:inactive' \
'user3:10022:10010:Dong Chen2:/bin/bash:active' \
'user4:10023:10010:Dong Chen3:/bin/bash:inactive' \
'user5:10024:10010:Dong Chen4:/bin/bash:active' \
'user6:10025:10010:Dong Chen5:/bin/bash:inactive' > awk_file
cat awk_file
BEGIN
及 END
模式将只打印一次:
awk -F: 'BEGIN{print "HEADER"}END{print "FOOTER"}{print $1,$2,$3,$4,$5}' awk_file
通过 -v
参数,我们可以自定义输出字段分隔符的变量 OFS
:
awk -v OFS=', ' -F: '{print $1, $4, $2, $3, $5}' awk_file
通过 printf
命令及其格式,我们可以打印格式化内容:
awk -F: '{printf "User Account: %s, Username: %s, User ID: %d, Group ID: %d, Login Shell: %s\n", $1, $4, $2, $3, $5}' awk_file
我们可以使用三目运算来做条件式语句操作:
awk -F: '($6=="active" ? status="Working hard" : status="Lazy"){printf "%s is %s.\n", $1, status }' awk_file
59. Advanced Text Processing - Awk’s Basic Usage
上一篇:
想看手册的其他内容?请访问该手册的所属专栏:《Linux 管理员手册:既简单又深刻》