awk
是一种强大的文本分析工具,它主要用于处理结构化的文本数据,即那些以某种模式分隔或有规律布局的文件内容。awk
的核心理念是基于模式匹配执行动作,它可以进行行读取、列(字段)分割、计算、字符串操作等,并支持自定义函数和逻辑控制结构。以下是 awk
的基本用法:
基本命令格式:
awk 'pattern {action}' file(s)
pattern
:可选,一个条件表达式或者模式,当某行满足该模式时,执行相应的动作。{action}
:在 pattern 匹配成功后执行的操作,可以是一条或多条语句,比如打印某个字段、进行数学运算等。file(s)
:要处理的输入文件名,也可以是管道(|
)的输出或其他命令的输出。
关键参数与内置变量:
-F
:指定输入字段分隔符,默认为空格或制表符。awk -F ',' '{print $1}' data.csv # 使用逗号作为分隔符处理CSV文件
- 内置变量:
NF
:当前记录(行)的字段数量。$n
:第 n 个字段的内容,例如$1
表示第一个字段。FILENAME
:当前正在处理的文件名。FNR
:当前文件中已读到的记录(行)数。FS
:输入字段分隔符变量,默认是空格。RS
:输入记录分隔符,默认是一个换行符。OFS
:输出字段分隔符,默认也是空格,可以更改。ORS
:输出记录分隔符,默认为换行符。ARGC
:命令行参数的数量。ARGV
:包含命令行参数的数组。
示例:
打印文件中所有行的第二列:
awk '{print $2}' test.txt
如果某列等于特定值,则打印整行:
awk '$3 == "example" {print}' log.txt
设置输入字段分隔符并处理:
awk -F ':' '/^user:/ {print $1}' /etc/passwd # 在/etc/passwd文件中查找以'user:'开头的行,并打印第一列
更复杂的操作,如累加某一列的值:
awk '{sum += $2} END {print sum}' numbers.txt
程序结构:
awk
中可以编写更复杂的程序,包括BEGIN、END块以及多个pattern-action对:
awk '
BEGIN {
# 初始化操作,在处理任何输入前执行
}
pattern1 {
# 当遇到pattern1匹配的行时执行的动作
}
pattern2 {
# 当遇到pattern2匹配的行时执行的动作
}
END {
# 在处理完所有输入后执行的动作
}
' input_file
以上只是 awk
功能的一部分,实际上它的功能远比这些复杂和强大,支持完整的编程语言特性,能够实现非常复杂的文本处理任务。