Shell流编辑器awk
1 awk简介
awk 是一种强大的文本处理工具和编程语言,广泛用于处理和分析文本文件,尤其是结构化文本(如 CSV 文件和日志文件)。awk 提供了丰富的功能,可以对文本进行过滤、格式化和数据提取。
2 awk语法格式
awk [options] 'pattern { action }' file
· options:awk 的选项,用于设置输入输出格式、定义变量等。
· pattern:模式,用于匹配输入文本中的特定行。如果省略模式,awk 将应用动作(action)到所有行。
· action:在匹配模式的行上执行的命令。用 {} 包围,可以包含多条命令。
· file:要处理的输入文件。awk 也可以处理来自管道的输入。
3 awk工作原理
-
启动与初始化: awk 程序启动时,首先会执行 BEGIN 块中的语句(如果存在)。这通常用于初始化操作,如设置字段分隔符(FS)等。
示例: awk ‘BEGIN { FS=“,”; OFS=“,” } { print $1, $2 }’ filename -
逐行读取输入: awk 从输入文件或标准输入中逐行读取数据。 每次读取一行,将其存储在模式空间(pattern space)中,同时会自动将行分割成字段(默认以空白字符为分隔符)。
-
模式匹配: awk 对每一行应用给定的模式(pattern),如果模式匹配成功,则执行相应的动作(action)。 模式可以是正则表达式、表达式、特定的条件(如字段值的比较)等。
示例: awk ‘/pattern/ { print $0 }’ filename -
执行动作: 如果模式匹配成功,awk 执行大括号 {} 内的动作。 动作可以是打印、赋值、算术运算、逻辑判断等。
示例: awk ‘{ sum += $1 } END { print sum }’ filename -
结束与清理:
当所有行都处理完后,awk 执行 END 块中的语句(如果存在)。这通常用于输出总结结果或进行清理操作。
示例: awk ‘END {print “Processing completed.” }’ filename
4 awk选项参数说明
4.1 -F fs 或 --field-separator fs
用于指定 awk 的输入字段分隔符(Field Separator)。默认情况下,awk 使用空白字符(空格或制表符)作为字段分隔符。但是,如果数据使用其他字符(如逗号、冒号、分号等),则可以使用 -F 选项来指定这些分隔符。
示例1 使用逗号作为分隔符
假设有一个文件 data.txt,内容如下:
Alice,30,New York
Bob,25,Los Angeles
Charlie,35,Chicago
打印每行的第一个字段和第三个字段。
awk -F ',' '{ print $1, $3 }' data.txt
输出:
Alice New York
Bob Los Angeles
Charlie Chicago
示例 2:使用冒号作为分隔符
文件 passwd.txt,内容如下:
root:x:0:0:root:/root:/bin/bashuser:x:1000:1000:User Name:/home/user:/bin/bash
打印用户名和主目录
awk -F ':' '{ print $1, $6 }' passwd.txt
输出:
root /root
user /home/user
示例 3:使用制表符作为分隔符
文件 data.tsv,内容如下:
Alice 30 New York
Bob 25 Los Angeles
Charlie 35 Chicago
打印每行的第一个字段和第三个字段
awk -F '\t' '{ print $1, $3 }' data.tsv
输出:
Alice New York
Bob Los Angeles
Charlie Chicago
示例4:设置内部字段分隔符
在 awk 脚本中,可以通过设置内置变量 FS 来指定字段分隔符,而不是命令行选项 -F。
BEGIN {
FS = ","
}
{
print $1, $3
}
将以上脚本保存为 script.awk,然后运行:
awk -f script.awk data.txt
输出与使用 -F ‘,’ 选项时相同。
4.2 -v var=value
说明:定义一个 awk 变量 var 并赋予初始值 value。
示例1:使用外部传入的阈值
假设有一个文件 data.txt,内容如下:
Alice 30
Bob 25
Charlie 35
打印年龄大于一个指定阈值的人的名字。这个阈值将通过命令行参数传递给 awk。
awk -v threshold=30 '$2 > threshold { print $1 }' data.txt
输出:
Charlie
在这个示例中,使用 -v threshold=30 定义了一个名为 threshold 的变量,并将其值设为 30。在 awk 脚本中,使用这个变量来过滤和打印年龄大于 30 的人的名字。
示例 2:结合多个外部变量
假设我们有一个更复杂的文件 data.txt,内容如下:
Alice 30 Sales
Bob 25 Marketing
Charlie 35 Engineering