awk
是一个强大的文本处理工具,在 Linux 和 UNIX 系统中被广泛使用。它用于模式扫描和文本/数据提取,以及对数据进行报告和转换。awk
的名字来自其创始人 Alfred Aho、Peter Weinberger 和 Brian Kernighan 的姓氏首字母。
基本结构
awk
的基本结构如下:
awk 'pattern { action }' file
pattern
:一个可选的模式,用于匹配行。如果省略,则对所有行执行action
。action
:当模式匹配到行时执行的动作。通常包括打印、赋值、算术运算等。file
:要处理的输入文件。
示例
打印文件内容
awk '{ print }' file.txt # 打印 file.txt 的所有内容
打印指定字段
默认情况下,awk
使用空白字符(空格和制表符)作为字段分隔符,并将字段编号从 1 开始。
echo -e "one two three\nfour five six" | awk '{ print $2 }' # 输出 "two" 和 "five"
打印多个字段
echo -e "one two three\nfour five six" | awk '{ print $1, $3 }' # 输出 "one three" 和 "four six"
使用自定义字段分隔符
echo "a:b:c" | awk -F: '{ print $2 }' # 使用冒号作为字段分隔符,输出 "b"
条件打印
echo -e "apple 10\nbanana 20\ncherry 5" | awk '$2 > 15 { print $1 }' # 输出 "banana
awk '/2024-04-28/ && !/The route/' storage/logs.error
内置变量
awk
有许多内置变量,如 NR
(当前行号)、NF
(当前行的字段数量)等。
echo -e "a b c\nd e f" | awk 'END { print NR }' # 输出行数,即 2
echo -e "a b c\nd e f" | awk '{ print NF }' # 输出每行的字段数,即 3
执行算术运算
echo -e "1 2\n3 4" | awk '{ print $1 + $2 }' # 输出每行的字段和,即 3 和 7
使用 BEGIN 和 END
BEGIN
在开始处理任何输入行之前执行一次动作,而 END
在处理完所有输入行之后执行一次动作。
echo -e "a\nb\nc" | awk 'BEGIN { print "Start" } { print } END { print "End" }'
# 输出:
# Start
# a
# b
# c
# End
进阶用法
多重模式与动作
echo -e "1 a\n2 b\n3 c" | awk '/1/ { print "One: " $0 } /2/ { print "Two: " $0 }'
# 输出:
# One: 1 a
# Two: 2 b
使用数组
echo -e "apple 10\nbanana 20\napple 30" | awk '{ sum[$1] += $2 } END { for (i in sum) print i, sum[i] }'
# 输出:
# apple 40
# banana 20
使用函数
awk
内置了许多函数,如 length()
、substr()
、toupper()
等。
echo "Hello World" | awk '{ print toupper($0) }' # 输出 "HELLO WORLD"
这只是 awk
功能的冰山一角。由于其强大的文本处理能力,awk
在日常的系统管理和文本处理任务中非常有用。要深入了解 awk
的所有功能和细节,建议查阅相关的手册页(man awk
)或权威的 awk
书籍。