awk
是 Linux/Unix 中强大的文本处理工具,擅长按行和列处理结构化数据(如日志、CSV等)。以下是核心用法和示例:
awk 'pattern {action}' 文件名
/regex/
或条件表达式)# 打印文件第1列和第3列(默认以空格/TAB分隔)
awk '{print $1, $3}' file.txt
# 指定分隔符(如逗号)
awk -F',' '{print $2}' data.csv
# 打印第2列大于100的行
awk '$2 > 100 {print $0}' file.txt
# 匹配包含"error"的行(正则)
awk '/error/ {print}' log.txt
# 多条件组合(&& 或 ||)
awk '$1 == "admin" && $3 <= 10 {print $2}' data.txt
awk '{print NR, $0}' file.txt # NR: 当前行号
awk 'END {print NF}' file.txt # NF: 当前行的列数
awk -F',' '{print FILENAME, FNR}' data.csv # FILENAME: 文件名;FNR: 文件内行号
# 求和第3列
awk '{sum += $3} END {print sum}' data.txt
# 计算行数
awk 'END {print NR}' file.txt
# 分组统计(如按第1列分组求和)
awk '{count[$1] += $2} END {for (k in count) print k, count[k]}' data.txt
awk -F',' -v OFS='|' '{print $1, $3}' data.csv # 输出用"|"分隔
# 预处理(BEGIN)和汇总(END)
awk 'BEGIN {print "Start"} {print $0} END {print "End"}' file.txt
awk '{total = $2 * $3; print $1, total}' sales.txt
awk '{if ($1 > 50) print $1; else print $2}' data.txt
awk '{system("echo " $1)}' file.txt
awk '{ip_count[$1]++} END {for (ip in ip_count) print ip, ip_count[ip]}' access.log
echo '{"name":"Alice","age":25}' | awk -F'"' '{print $4, $8}'
awk '{printf "Name: %-10s Score: %d\n", $1, $2}' scores.txt
-F
指定其他分隔符。$0
表示整行,$1
、$2
... 表示第1、2列。grep
、sort
等命令可更强大,如:
bash
grep "error" log.txt | awk '{print $3}' | sort -n
掌握这些用法后,awk
能高效解决大部分文本处理需求!