linux awk命令是linux系统中常用的文本处理工具,它支持按行读取文本,对每一行的内容进行分割、匹配、计算等操作,适合处理结构化的文本数据,比如日志文件、csv格式数据等。

awk基本语法结构
awk的基础语法格式如下,其中单引号包裹的是awk的处理逻辑,文件名是要处理的文本文件路径:
awk 'pattern { action }' 文件名
pattern是匹配条件,可以是正则表达式、比较表达式等,action是匹配到内容后执行的操作,默认操作是打印整行内容。如果不指定pattern,会对所有行执行action。
常用内置变量说明
awk提供了多个内置变量,方便用户快速获取文本的行号、字段内容等信息,常用的内置变量如下:
| 变量名 | 含义 |
|---|---|
| $0 | 当前处理的整行内容 |
| $n | 当前行的第n个字段,n为数字,从1开始 |
| NR | 当前处理的行号,从1开始计数 |
| NF | 当前行的字段总数 |
| FS | 输入字段分隔符,默认是空白字符(空格、制表符等) |
| OFS | 输出字段分隔符,默认是空格 |
基础使用示例
1. 打印文本指定列
假设我们有一个名为test.txt的文件,内容如下,字段之间用空格分隔:
张三 18 男 北京 李四 20 女 上海 王五 19 男 广州
如果要打印所有行的第一列和第三列,可以使用以下命令:
awk '{print $1, $3}' test.txt
执行后输出结果为:
张三 男 李四 女 王五 男
2. 指定字段分隔符
如果文本使用的是逗号分隔的csv格式,比如data.csv内容如下:
name,age,city 张三,18,北京 李四,20,上海
可以通过-F参数指定分隔符为逗号,打印第二列内容:
awk -F ',' '{print $2}' data.csv
输出结果为:
age 18 20
3. 结合条件筛选行
如果要筛选test.txt中年龄大于18的行,并打印姓名和年龄,可以使用比较表达式作为pattern:
awk '$2 > 18 {print $1, $2}' test.txt
执行后输出:
李四 20
4. 统计行数和字段数
统计test.txt的总行数,可以利用NR变量:
awk 'END {print NR}' test.txt
统计每一行的字段数,打印行号和字段数:
awk '{print "行号:" NR, "字段数:" NF}' test.txt
进阶用法示例
1. 使用BEGIN和END块
BEGIN块在处理文本前执行,END块在处理完所有文本后执行,常用于初始化变量或者输出汇总结果。比如计算所有用户的平均年龄:
awk 'BEGIN {sum=0; count=0} {sum+=$2; count++} END {print "平均年龄:" sum/count}' test.txt
执行后输出:
平均年龄:19
2. 自定义变量和逻辑判断
可以自定义变量存储中间结果,结合if判断实现复杂逻辑。比如统计男女人数:
awk '{
if ($3 == "男") {
male_count++
} else if ($3 == "女") {
female_count++
}
}
END {
print "男性人数:" male_count
print "女性人数:" female_count
}' test.txt
输出结果为:
男性人数:2 女性人数:1
3. 正则匹配筛选
如果要筛选city字段包含京的行,可以使用正则匹配:
awk '$4 ~ /京/ {print $0}' test.txt
输出结果为:
张三 18 男 北京
如果要筛选不包含京的行,使用!~操作符即可:
awk '$4 !~ /京/ {print $0}' test.txt