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

处理文件内容

以及处理文件的内容:
我们准备一些测试内容:

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

输出头及脚信息

BEGINEND 模式将只打印一次:

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 管理员手册:既简单又深刻

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值