Linux awk 命令:文本流处理与日志分析大师

举报
yd_232564628 发表于 2026/09/28 10:57:22 2026/09/28
【摘要】 awk 是 Linux 命令行中处理结构化文本数据的终极武器。它的名字来源于三位创始人 Alfred Aho, Peter Weinberger, and Brian Kernighan 的首字母。与 grep(按行过滤)和 sed(按行编辑)不同,awk 擅长将文本视为由“字段”(列)组成的记录(行),非常适合处理日志文件、表格数据和系统命令输出。 最基础的用法awk '{print $0...

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、内存等暂时不关心的信息。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。