awk命令可实现Linux文本列的精细化处理:一、用-F指定分隔符提取列;二、结合正则条件筛选后输出;三、用正则FS或match/substr处理复杂字段;四、对列值进行算术运算与printf格式化;五、利用NR、RS等变量处理跨行数据。
如果您需要在Linux系统中对文本文件的列进行精细化处理,尤其是提取特定列并结合条件筛选、格式化或计算,awk命令提供了强大而灵活的进阶能力。以下是实现此类操作的具体方法:
一、使用awk按字段分隔符提取指定列
awk默认以空白字符(空格或制表符)为分隔符,通过$N可直接引用第N列。当文本使用非默认分隔符(如冒号、逗号、竖线)时,需显式指定-F选项。
1、提取/etc/passwd文件中用户名(第1列)和用户ID(第3列),以冒号为分隔符:
awk -F ‘:’ ‘{print $1, $3}’ /etc/passwd
2、提取CSV文件中第2列和第4列,以英文逗号为分隔符:
awk -F ‘,’ ‘{print $2, $4}’ data.csv
3、提取以竖线分隔的日志片段中第5列(响应状态码)和第8列(字节数):
awk -F ‘|’ ‘{print $5, $8}’ access.log
二、结合正则匹配条件筛选后提取列
awk支持在打印前对整行或某列执行模式匹配,仅对满足条件的记录执行列提取操作,避免冗余输出。
1、从netstat输出中提取所有处于ESTABLISHED状态的连接,并只显示本地端口(第4列)和远程地址(第5列):
netstat -tn | awk ‘$6 == “ESTABLISHED” {print $4, $5}’
2、从ps输出中筛选包含”nginx”的进程,提取PID(第2列)和命令名(第11列):
ps aux | awk ‘$11 ~ /nginx/ {print $2, $11}’
3、提取/etc/fstab中非注释、非空行的第1列(设备路径)和第2列(挂载点),跳过以#开头或全空白的行:
awk ‘!/^$/ && !/^\\s*#/ {print $1, $2}’ /etc/fstab
三、使用自定义字段分隔符与动态列定位
当字段内容本身包含空格但逻辑上属于同一列(如日志中的带空格时间戳),可借助正则表达式定义FS,或用match()函数配合substr()精确定位。
1、将Apache日志中双引号包裹的User-Agent字段(通常为第12列)完整提取,避免被内部空格错误切分:
awk -F ‘”[^”]*”|\s+’ ‘{print }’ access.log