Unix awk命令

本文介绍了AWK命令的强大功能及其应用场景,包括文本处理、字段提取等,并通过多个示例展示了如何利用AWK进行复杂的文本分析任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

AWK的功能是什么?
与sed和grep很相似,awk是一种样式扫描与处理工具。但其功能却大大强于sed和grep。 
awk处理的工作与数据库的处理方式有相同之处:
其相同处之一就是awk支持对记录和字段的处理,在awk中,缺省的情况下总是将文本文件中的一行视为一个记录,而将一行中的某一部分作为记录中的一个字段。为了操作这些不同的字段,awk借用shell的方法,用$1,$2,$3...这样的方式来顺序地表示行(记录)中的不同字段。特殊地,awk用$0表示整个行(记录)。不同的字段之间是用称作分隔符的字符分隔开的。系统默认的分隔符是空格。awk允许在命令行中用-F re的形式来改变这个分隔符。
例:显示文本文件myfile中第七行到第十五行中以字符%分隔的第一字段,第三字段和第七字段:
awk -F % /'NR==7,NR==15 {printf $1 $3 $7}/'

显示文件myfile中的行号和第3字段:
$awk /'{printf/"%03d%s//n/",NR,$1}/' myfile

$ awk /'{ print }/' /etc/passwd
您将会见到 /etc/passwd 文件的内容出现在眼前。现在,解释 awk 做了些什么。调用 awk 时,我们指定 /etc/passwd 作为输入文件。执行 awk 时,它依次对 /etc/passwd 中的每一行执行 print 命令。所有输出都发送到 stdout,所得到的结果与与执行catting /etc/passwd完全相同。
现在,解释 { print } 代码块。在 awk 中,花括号用于将几块代码组合到一起,这一点类似于 C 语言。在代码块中只有一条 print 命令。在 awk 中,如果只出现 print 命令,那么将打印当前行的全部内容。

这里是另一个 awk 示例,它的作用与上例完全相同:
$ awk /'{ print $0 }/' /etc/passwd
awk 中,$0 变量表示整个当前行,所以 print 和 print $0 的作用完全一样。

如果您愿意,可以创建一个 awk 程序,让它输出与输入数据完全无关的数据。以下是一个示例:
$ awk /'{ print /"/" }/' /etc/passwd
只要将 /"/" 字符串传递给 print 命令,它就会打印空白行。如果测试该脚本,将会发现对于 /etc/passwd 文件中的每一行,awk 都输出一个空白行。再次说明, awk 对输入文件中的每一行都执行这个脚本。以下是另一个示例:
$ awk /'{ print /"hiya/" }/' /etc/passwd
运行这个脚本将在您的屏幕上写满 hiya。

$ awk -F/":/" /'{ print $1 }/' /etc/passwd
上例中,在调用 awk 时,使用 -F 选项来指定 /":/" 作为字段分隔符。awk 处理 print $1 命令时,它会打印出在输入文件中每一行中出现的第一个字段。

当两个字符串在 awk 程序中彼此相邻时,awk 会连接它们但不在它们之间添加空格。以下命令会在这两个字段中插入空格:
$ awk -F/":/" /'{ print $1 /" /" $3 }/' /etc/passwd
以这种方式调用 print 时,它将连接 $1、/" /" 和 $3,创建可读的输出。当然,如果需要的话,我们还可以插入一些文本标签:
$ awk -F/":/" /'{ print /"username: /" $1 /"//t//tuid:/" $3/" }/' /etc/passwd
这将产生以下输出:
username: halt uid:7username: operator uid:11username: root uid:0username: shutdown uid:6username: sync uid:5username: bin uid:1....etc. 外部脚本

另外,awk 还提供了 /"~/" 和 /"!~/" 运算符,它们分别表示“匹配”和“不匹配”。它们的用法是在运算符左边指定变量,在右边指定规则表达式。如果某一行的第五个字段包含字符序列 root,那么以下示例将只打印这一行中的第三个字段:
$5 ~ /root/ { print $3 }

awk 还提供了非常好的类似于 C 语言的 if 语句。如果您愿意,可以使用 if 语句重写前一个脚本:
{ if ( $5 ~ /root/ ) { print $3 }}
这两个脚本的功能完全一样。

附录:.awk的常规表达式元字符

/ 换码序列
^ 在字符串的开头开始匹配
$ 在字符串的结尾开始匹配
. 与任何单个字符串匹配
[ABC] 与[]内的任一字符匹配
[A-Ca-c] 与A-C及a-c范围内的字符匹配(按字母表顺序)
[^ABC] 与除[]内的所有字符以外的任一字符匹配
Desk|Chair 与Desk和Chair中的任一个匹配
[ABC][DEF] 关联。与A、B、C中的任一字符匹配,且其后要跟D、E、F中的任一个字符。
* 与A、B或C中任一个出现0次或多次的字符相匹配
+ 与A、B或C中任何一个出现1次或多次的字符相匹配
? 与一个空串或A、B或C在任何一个字符相匹配
(Blue|Black)berry 合并常规表达式,与Blueberry或Blackberry相匹配

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值