开篇词
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。 |
= += -= *= /= %= ^= | 分配。 |
I/O Statements
选项 | 用途 |
---|---|
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
If Else 三目运算
我们可以使用三目运算来做条件式语句操作:
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 管理员手册:既简单又深刻》