awk
awk 完整速查手册
一、awk 是什么
awk 是 Linux 下强大的文本处理工具,按行读取文件,按列(字段)分割处理。可以理解为命令行的 Excel。
二、基本语法
bash
awk '条件 {动作}' 文件名
- 条件:筛选哪些行(可选,不写则处理所有行)
- 动作:对筛选出的行做什么(必填,用
{}包裹)
三、内置变量
| 变量 | 含义 | 示例 |
|---|---|---|
$0 |
整行内容 | {print $0} |
$1 ~ $N |
第1到第N列 | {print $1, $3} |
$NF |
最后一列 | {print $NF} |
$(NF-1) |
倒数第二列 | {print $(NF-1)} |
NR |
行号(从1开始) | {print NR, $0} |
NF |
当前行的列数 | {print NF} |
FS |
输入分隔符(默认空格/Tab) | BEGIN{FS=":"} |
OFS |
输出分隔符(默认空格) | BEGIN{OFS=","} |
RS |
行分隔符(默认换行符) | BEGIN{RS=":"} |
ORS |
输出行分隔符(默认换行符) | BEGIN{ORS="\n"} |
四、常用命令速查
1. 显示行号
bash
awk '{print NR, $0}' 文件名
2. 打印指定列
bash
awk '{print $1, $3}' 文件名 # 打印第1列和第3列
awk '{print $NF}' 文件名 # 打印最后一列
awk '{print $(NF-1)}' 文件名 # 打印倒数第二列
3. 自定义分隔符
bash
awk -F ':' '{print $1, $3}' 文件名 # 以冒号分隔
awk -F '[,.]' '{print $1, $3}' 文件名 # 以逗号或点号分隔
awk 'BEGIN{FS=":"} {print $1}' 文件名 # 另一种写法
4. 匹配关键词
bash
awk '/error/' 文件名 # 包含 error
awk '/error/ {print NR, $0}' 文件名 # 匹配并显示行号
awk '!/info/' 文件名 # 不包含 info
awk 'tolower($0) ~ /error/' 文件名 # 忽略大小写
5. 条件筛选
bash
awk '$3 == "女"' 文件名 # 第3列等于"女"
awk '$4 > 85' 文件名 # 第4列大于85
awk '$3 == "男" && $4 > 80' 文件名 # 第3列为男 且 第4列大于80
awk '$1 == "192.168.1.10"' 文件名 # 第1列等于IP
awk 'NR > 1' 文件名 # 跳过第1行(表头)
6. 统计计算
bash
awk '{sum += $5} END {print sum}' 文件名 # 求和
awk '{sum += $5} END {print sum/NR}' 文件名 # 平均值
awk '{count++} END {print count}' 文件名 # 计数
awk '{max = max > $4 ? max : $4} END {print max}' 文件名 # 最大值
awk '{min = min ? min : $4; min = min < $4 ? min : $4} END {print min}' 文件名 # 最小值
7. 输出格式化
bash
awk '{print "姓名:" $2, "语文:" $4}' 文件名 # 自定义格式
awk '{printf "%-5s %-10s %-5s\n", $1, $2, $3}' 文件名 # 对齐输出
awk 'BEGIN{OFS=" | "} {print $1, $2, $3}' 文件名 # 自定义输出分隔符
8. 其他常用
bash
awk 'END {print NR}' 文件名 # 统计总行数(等价于 wc -l)
awk '{print NR, $NF}' 文件名 # 显示行号和最后一列
awk '{print $1, $2, $3+$4+$5}' 文件名 # 列之间做运算
awk '$4 > 60 {print $2, $4}' 文件名 # 条件筛选 + 打印指定列
五、针对你的 students.txt 的示例
文件内容:
text
学号 姓名 性别 语文 数学 英语 城市
1 张三 男 85 92 78 北京
2 李四 女 90 88 95 上海
bash
awk '{print $2, $4}' students.txt
# 输出:姓名 语文 / 张三 85 / 李四 90
awk '$3 == "女"' students.txt
# 输出所有女生的整行信息
awk '$4 > 80 {print $2, "语文:", $4}' students.txt
# 语文>80:张三 语文:85 / 李四 语文:90
awk '{sum += $5} END {print "数学总分:", sum}' students.txt
# 数学总分: 180
awk 'NR>1 {print $2, $4+$5+$6}' students.txt
# 跳过表头,显示姓名和三科总分
awk 'NR==1 {print "=== 成绩单 ==="} NR>1 {print $2, "总分:", $4+$5+$6}' students.txt
# 带标题输出
六、awk vs grep vs sed 对比
| 工具 | 主要用途 | 一句话概括 |
|---|---|---|
| grep | 搜索匹配的行 | 找行 |
| awk | 处理列/字段 | 切列 |
| sed | 替换/编辑文本 | 改内容 |
七、一行命令速查表
| 需求 | 命令 |
|---|---|
| 显示所有行带行号 | awk '{print NR, $0}' 文件 |
| 打印第2列和第4列 | awk '{print $2, $4}' 文件 |
| 打印最后一列 | awk '{print $NF}' 文件 |
| 第3列为"女"的行 | awk '$3 == "女"' 文件 |
| 第4列大于80的行 | awk '$4 > 80' 文件 |
| 匹配"error"并显示行号 | awk '/error/ {print NR, $0}' 文件 |
| 求和(第5列) | awk '{sum += $5} END {print sum}' 文件 |
| 平均数(第5列) | awk '{sum += $5} END {print sum/NR}' 文件 |
| 统计总行数 | awk 'END {print NR}' 文件 |
| 按冒号分割取第1列 | awk -F ':' '{print $1}' 文件 |
| 跳过第1行 | awk 'NR>1' 文件 |
| 自定义输出格式 | awk '{print "姓名:" $2, "成绩:" $4}' 文件 |
八、常用条件运算符
| 运算符 | 含义 | 示例 |
|---|---|---|
== |
等于 | $3 == "男" |
!= |
不等于 | $3 != "女" |
> |
大于 | $4 > 85 |
< |
小于 | $4 < 60 |
>= |
大于等于 | $4 >= 80 |
<= |
小于等于 | $4 <= 70 |
&& |
且(AND) | $3=="男" && $4>80 |
| ` | ` | |
~ |
正则匹配 | $2 ~ /张/ |
!~ |
不匹配 | $2 !~ /张/ |
| 参数/命令 | 含义 |
|---|---|
-n |
不自动打印(配合 p 使用) |
-e |
多点编辑(执行多个命令) |
-i |
直接修改文件(不加则只是预览) |
p |
打印(print) |
d |
删除(delete) |
s/旧/新/ |
替换(substitute) |
s/旧/新/g |
全局替换 |
s/旧/新/2 |
替换每行第2个 |
^ |
行首(匹配时) |
$ |
行尾(匹配时) |
/^$/d |
删除空行 |
grep -E 'ERROR | WARN' rizhi.txt | sed 's/login/登录/g' | awk '{print $2,$3,$4,$5}'
grep 'error' rizhi.txt | awk '{print $1,$2}' | sort| uniq -c |sort -rn | head -10
浙公网安备 33010602011771号