awk 用于分析、过滤和生成报告。
基本用法
awk 'pattern {action}' filename
常用选项
-
-F:指定字段分隔符awk -F',' '{print $1}' filename例子:使用逗号作为字段分隔符,并打印第一列。
-
-v:定义变量awk -v var=value 'BEGIN {print var}'例子:定义变量并在
BEGIN块中使用。 -
-f:从文件中读取awk脚本awk -f script.awk filename
基本操作
打印文本
-
打印整行
awk '{print}' filename例子:打印文件
example.txt的所有行。 -
打印指定字段
awk '{print $1, $2}' filename例子:打印文件
example.txt的第一列和第二列。 -
添加文本
awk '{print "Line:", $0}' filename例子:在每行前添加
Line:。
过滤文本
-
根据模式过滤行
awk '/pattern/' filename例子:打印包含
hello的行。awk '/hello/' example.txt -
根据字段值过滤行
awk '$1 > 100' filename例子:打印第一列大于 100 的行。
awk '$1 > 100' example.txt
内置变量
$0:表示整行$1, $2, ...:表示第 1 列、第 2 列,依此类推NR:表示行号NF:表示字段数FS:字段分隔符OFS:输出字段分隔符
高级操作
计算和统计
-
求和
awk '{sum += $1} END {print sum}' filename例子:计算第一列的和。
awk '{sum += $1} END {print sum}' example.txt -
计数
awk 'END {print NR}' filename例子:统计行数。
awk 'END {print NR}' example.txt
条件语句
-
if语句awk '{if ($1 > 100) print $1}' filename例子:打印第一列大于 100 的值。
awk '{if ($1 > 100) print $1}' example.txt -
if-else语句awk '{if ($1 > 100) print $1; else print "less"}' filename例子:打印第一列大于 100 的值,否则打印
less。awk '{if ($1 > 100) print $1; else print "less"}' example.txt
循环
for循环
例子:打印每行的每个字段。awk '{for (i = 1; i <= NF; i++) print $i}' filenameawk '{for (i = 1; i <= NF; i++) print $i}' example.txt
内置函数
-
字符串长度
awk '{print length($1)}' filename例子:打印第一列的字符串长度。
awk '{print length($1)}' example.txt -
子字符串
awk '{print substr($1, 1, 3)}' filename例子:打印第一列的前 3 个字符。
awk '{print substr($1, 1, 3)}' example.txt -
正则表达式匹配
awk '$1 ~ /^[0-9]+$/' filename例子:打印第一列是数字的行。
awk '$1 ~ /^[0-9]+$/' example.txt
综合示例
-
处理 CSV 文件
awk -F',' '{print $1, $2}' filename.csv例子:打印 CSV 文件的第一列和第二列。
awk -F',' '{print $1, $2}' example.csv -
统计字段出现次数
awk '{count[$1]++} END {for (word in count) print word, count[word]}' filename例子:统计第一列中每个值出现的次数。
awk '{count[$1]++} END {for (word in count) print word, count[word]}' example.txt -
多条件过滤
awk '$1 > 100 && $2 < 50' filename例子:打印第一列大于 100 且第二列小于 50 的行。
awk '$1 > 100 && $2 < 50' example.txt
从文件读取 awk 脚本
可以将 awk 脚本存储在文件中,然后使用 -f 选项从文件中读取。
-
脚本文件
script.awk内容{print $1, $2} -
执行脚本
awk -f script.awk filename
使用 awk 处理多行输出
-
搜索多行模式
awk '/start_pattern/,/end_pattern/' filename -
与其他命令结合使用
grep 'pattern' filename | awk '{print $1}'ps aux | awk '{print $1, $2}'