使用 awk 重排字段
awk 默认以空格或制表符为分隔符,通过 $1, $2, ... 表示字段($0 为整行)。
基本语法
command | awk '{print $3, $1, $2}' # 输出第3列、第1列、第2列
示例场景
-
调整列顺序
将ls -l输出的权限列(第1列)与文件名列(第9列)互换:ls -l | awk '{print $9, $2, $3, $4, $5, $6, $7, $8, $1}' -
选择部分列
提取ps aux的进程ID(第2列)和命令(第11列):ps aux | awk '{print $2, $11}' -
自定义分隔符
若字段以逗号分隔(如CSV文件),用-F指定分隔符:echo "Alice,30,Engineer" | awk -F ',' '{print $3, $1}' # 输出:Engineer Alice -
在字段间插入固定文本:
df -h | awk '{print "分区: " $1, "可用空间: " $4}'
其他工具的组合使用
-
cut+paste(简单列提取与合并)
提取第1列和第3列后合并:cut -d' ' -f1 file.txt > col1.txt cut -d' ' -f3 file.txt > col3.txt paste col1.txt col3.txt > result.txt
-
sed调整固定格式(不推荐复杂重排)
仅适用于严格对齐的文本(如交换前两列):sed -E 's/(\S+)\s+(\S+)/\2 \1/' file.txt
注意事项
-
分隔符处理
- 默认分隔符为连续空格/制表符,若需保留空格,用
-F指定明确分隔符(如-F':')。 - 含空格的字段(如文件名)需结合
OFS(输出分隔符):ls -l | awk 'BEGIN {OFS=" | "} {print $9, $1}'
- 默认分隔符为连续空格/制表符,若需保留空格,用
-
表头处理
若输出含表头(如ls -l的首行),用NR>1跳过:ls -l | awk 'NR>1 {print $9, $1}' -
多命令组合
复杂场景可串联多个工具(如awk过滤后通过sort排序):ps aux | awk '{print $2, $11}' | sort -n
- 首选工具:
awk是重排字段的最灵活方案,支持自定义分隔符、列选择及格式调整。 - 适用场景:
- 简单列提取 →
cut - 动态重排/复杂逻辑 →
awk - 固定格式微调 →
sed
- 简单列提取 →
- 安全提示:操作前用
head命令测试样本(如command | head | awk '{...}'),避免误处理大量数据。
引用说明:本文方法基于 GNU Awk 用户指南及 Linux 核心工具手册(AWK 官方文档,POSIX 标准),实践时请确保使用 Bash 4.0+ 或兼容环境。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/4640.html