awk

image-20260715101312110 image-20260715101507931 image-20260715101826333

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
posted @ 2026-07-23 17:13  珉好好  阅读(7)  评论(0)    收藏  举报