Linux awk 命令:文本流处理与日志分析大师
awk 是 Linux 命令行中处理结构化文本数据的终极武器。它的名字来源于三位创始人 Alfred Aho, Peter Weinberger, and Brian Kernighan 的首字母。与 grep(按行过滤)和 sed(按行编辑)不同,awk 擅长将文本视为由“字段”(列)组成的记录(行),非常适合处理日志文件、表格数据和系统命令输出。
最基础的用法
awk '{print $0}' filename
默认情况下,awk 以空格或制表符为分隔符,将每一行切分成多个字段。$1 代表第一列,$2 代表第二列,以此类推;$0 代表整行内容。上面的命令会原样输出文件的每一行。
实际使用中,高频场景与命令组合
1.指定分隔符提取数据
当处理 CSV 文件或 /etc/passwd 这种非空格分隔的文件时,必须使用 -F 参数。
awk -F: '{print $1, $3}' /etc/passwd
这会以冒号 : 为分隔符,打印出系统所有用户的用户名(第1列)和 UID(第3列)。
2.条件过滤与模式匹配
awk 可以在打印前进行逻辑判断,类似于编程语言中的 if 语句。
awk '$3 > 1000 {print $1}' /etc/passwd
只打印 UID 大于 1000 的用户名(通常是普通用户)。也可以使用正则表达式:
awk '/error/ {print $0}' /var/log/syslog
只输出包含 “error” 关键字的日志行。
3.数据统计与数学运算
这是 awk 区别于其他文本工具的核心优势。它内置了变量和算术运算能力。
awk '{sum += $1} END {print "Total:", sum, "Average:", sum/NR}' data.txt
这段代码会累加第一列的所有数值,并在处理完所有行(END 块)后,输出总和与平均值。NR 是内置变量,代表当前处理的行数。
4.格式化输出
使用 printf 可以像 C 语言一样控制输出格式,生成整齐的报表。
awk '{printf "%-20s %10dn", $1, $2}' report.txt
这会让第一列左对齐占 20 个字符宽度,第二列右对齐占 10 个字符宽度,非常适合阅读。
5.处理多个文件
awk 可以一次性处理多个文件,并利用 FILENAME 变量区分当前正在处理哪个文件。
awk 'FNR==1 {print "Processing:", FILENAME} {count++} END {print "Total lines:", count}' file1.log file2.log
如果不知道如何下手,可以先尝试
awk '{print NF, $0}' filename
NF 是内置变量,代表当前行的字段数量(列数)。这个命令会在每行前面加上列数,帮你快速了解文件的结构是否整齐,有没有缺列的情况。
或者,如果你想快速查看某个命令输出的特定列,可以直接通过管道传递:
ps aux | awk '{print $1, $2, $11}'
只查看进程的用户、PID 和启动命令,忽略 CPU、内存等暂时不关心的信息。
- 点赞
- 收藏
- 关注作者
评论(0)