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}' filename
awk '{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}'