目录:
awk 不像 grep 只能查找文本,也不像 sed 只能编辑整行,而是能先把一行文本按空格(或你指定的符号)切成好几块(字段),然后对这些“小块”进行筛选、计算、统计、格式化等操作。
工作原理:
更厉害的是,awk 的程序结构由三个清晰的模块组成,执行顺序非常明确:
格式: awk 'pattern {action}' 文件名
需要记忆的内置变量:
命令 ls -l 会输出很多信息,但我们可能只关心文件名(第9列)和大小(第5列)
$ ls -l | awk '{print $9, $5}'
/etc/passwd 文件保存了用户信息,字段用冒号 : 分隔。
我们想提取用户名(第1列)和使用的 Shell(最后一列)。
$ awk -F: '{print $1, $NF}' /etc/passwd
$ df -h
Filesystem Size Used Avail Capacity iused ifree %iused Mounted on
/dev/disk3s1s1 460Gi 11Gi 92Gi 12% 453k 961M 0% /
devfs 208Ki 208Ki 0Bi 100% 720 0 100% /dev
/dev/disk3s6 460Gi 7.0Gi 92Gi 8% 7 961M 0% /System/Volumes/VM
$ df -h | awk '$5+0 > 80 {print $1, $5}'
df -h 查看磁盘使用情况,第 5 列是使用率(带 % 号)。$5+0 是为了把带 % 的字符串转换成数字,以便进行大小比较(> 80)。
在配置文件(如 /etc/fstab)中,想只看有效的配置行,忽略以 # 开头的注释行。
$ awk '$1 !~ /^#/ && NF > 0 {print $0}' /etc/fstab
假设有一个文件 numbers.txt,每行只有一个数字。
$ awk '{sum += $1} END {print "总和是:", sum}' numbers.txt
对每一行的第一列($1)进行累加(sum += $1),处理完所有行后,在 END 块中打印总和。
假设 access.log 的第一列是IP地址。
$ awk '{ip[$1]++} END {for (i in ip) print ip[i], i}' access.log | sort -nr | head -5
这里用到了数组 ip,以 IP 地址为下标进行计数。END 块中遍历数组并打印每个 IP 及其出现次数,最后通过管道 | 排序并取前 5 名。
将文件中所有的 “old” 替换为 “new”,gsub 是全局替换函数。
$ awk '{gsub(/old/, "new", $0); print}' file.txt
↶ 返回首页 ↶