59. 高级文本处理 - Awk 的常见用法

开篇词

Awk 是一个灵活的模式匹配、文本处理及面向行的语言。Linux 为我们提供了其实现版本:gwak

我们可以使用 awkgawk 命令来演示,awkgawk 的一个软链接:

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}'

59. 高级文本处理 - Awk 的常见用法_第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

59. 高级文本处理 - Awk 的常见用法_第2张图片

输出头及脚信息

BEGINEND 模式将只打印一次:

awk -F: 'BEGIN{print "HEADER"}END{print "FOOTER"}{print $1,$2,$3,$4,$5}' awk_file

59. 高级文本处理 - Awk 的常见用法_第3张图片

使用自定义字段分隔符来输出

通过 -v 参数,我们可以自定义输出字段分隔符的变量 OFS

awk -v OFS=', ' -F: '{print $1, $4, $2, $3, $5}' awk_file

59. 高级文本处理 - Awk 的常见用法_第4张图片

输出格式化内容

通过 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
 

引用

  • GNU Awk 用户指南
  • GAWK(1)
     

参见

上一篇:

  • 58. 高级文本处理 - 流编辑器(Sed)

想看手册的其他内容?请访问该手册的所属专栏:《Linux 管理员手册:既简单又深刻

你可能感兴趣的:(Linux,管理员手册)