cut 和 awk 都是 Linux 中用于文本处理的命令行工具,常用于从文件或数据流中提取、处理和分析文本。cut 偏向简单、快速的列提取,而 awk 是一个完整的文本处理编程语言,功能强大得多。
一、cut 命令:简单列提取
cut 用于按列(字段)或字符位置从文本中提取数据,适合处理结构化的表格数据(如 CSV、日志)。
1. 基本语法
cut -d 分隔符 -f 字段列表 文件
cut -c 字符范围 文件
2. 常用选项
| 选项 | 含义 | 示例 |
|---|---|---|
-d | 指定字段分隔符(默认是制表符 \t) | -d',' 指定逗号分隔 |
-f | 指定要提取的字段(列) | -f1,3 提取第1和第3列 |
-c | 按字符位置提取 | -c1-5 提取第1到第5个字符 |
--complement | 提取指定字段以外的字段 | -f2 --complement 提取除第2列外的所有列 |
3. 使用示例
示例 1:提取 CSV 文件中的列
# 假设 data.csv 内容:
# 姓名,年龄,城市
# Alice,25,北京
# Bob,30,上海
# 提取第 1 列和第 3 列
cut -d',' -f1,3 data.csv
# 输出:
# 姓名,城市
# Alice,北京
# Bob,上海
# 提取第 2 列(年龄)
cut -d',' -f2 data.csv
# 输出:
# 年龄
# 25
# 30
示例 2:提取日志文件中的特定字段
# 提取 /etc/passwd 中的用户名(第1列)和 shell(第7列)
cut -d':' -f1,7 /etc/passwd | head -3
# 输出:
# root:/bin/bash
# daemon:/usr/sbin/nologin
# bin:/usr/sbin/nologin
示例 3:按字符位置提取
# 提取每行的前 10 个字符
cut -c1-10 file.txt
# 提取每行的第 5 到第 15 个字符
cut -c5-15 file.txt
# 提取每行的第 10 个字符
cut -c10 file.txt
示例 4:配合管道使用
# 查看占用内存前 5 的进程(提取 PID 和 CMD)
ps aux --sort=-%mem | head -6 | tail -5 | cut -c10-20,50-
二、awk 命令:文本处理编程语言
awk 是一个强大的文本分析工具,它更像一门编程语言,支持变量、条件判断、循环、数组等,适合更复杂的文本处理任务。
1. 基本语法
awk '模式 { 动作 }' 文件
-
模式:条件,如
NR>1、/error/ -
动作:对匹配行执行的操作,如
print $1、sum+=$3
2. 常用内置变量
| 变量 | 含义 |
|---|---|
$0 | 整行内容 |
$1, $2... | 第1列、第2列... |
NF | 当前行的列数(Number of Fields) |
NR | 行号(从1开始) |
FS | 输入字段分隔符(Field Separator) |
OFS | 输出字段分隔符 |
RS | 输入记录分隔符(行分隔符) |
ORS | 输出记录分隔符 |
3. 使用示例
示例 1:打印整行或特定列
# 打印整行
awk '{print $0}' file.txt
# 打印第1列和第3列(默认以空格分隔)
awk '{print $1, $3}' file.txt
# 打印第2列和第5列,用逗号分隔
awk '{print $2 "," $5}' file.txt
# 打印文件中的第 2 列
awk '{print $2}' data.txt
示例 2:指定分隔符
# 处理 CSV(逗号分隔)
awk -F',' '{print $1, $3}' data.csv
# 等价于:
awk 'BEGIN{FS=","} {print $1, $3}' data.csv
# 处理 /etc/passwd(冒号分隔)
awk -F':' '{print $1, $7}' /etc/passwd
示例 3:条件过滤
# 打印文件头(第1行)
awk 'NR==1' file.txt
# 打印第 10 到第 20 行
awk 'NR>=10 && NR<=20' file.txt
# 打印包含 "error" 的行
awk '/error/ {print $0}' log.txt
# 打印第3列大于50的行
awk '$3 > 50 {print $0}' scores.txt
# 打印第2列以 /bin/ 开头的行
awk '$2 ~ /^\/bin\// {print $0}' file.txt
示例 4:计算和统计
# 计算第3列的总和
awk '{sum += $3} END {print "总和:", sum}' data.txt
# 计算行数
awk 'END {print "总行数:", NR}' file.txt
# 计算第3列的平均值
awk '{sum += $3} END {print "平均值:", sum / NR}' data.txt
# 统计每行的列数
awk '{print NF, $0}' file.txt
示例 5:格式化输出
# 自定义输出格式
awk '{printf "姓名: %-10s 年龄: %3d\n", $1, $2}' data.txt
# 添加表头
awk 'BEGIN{print "姓名\t年龄"} {print $1"\t"$2}' data.txt
三、cut vs awk 对比
| 特性 | cut | awk |
|---|---|---|
| 功能 | 简单的列提取 | 完整的文本处理语言 |
| 编程能力 | 无 | 支持变量、循环、数组、条件判断 |
| 复杂计算 | 不支持 | 支持 |
| 分隔符 | 单个字符 | 支持正则表达式 |
| 学习难度 | 低 | 中等 |
| 适用场景 | 快速、简单的列提取 | 复杂的文本处理和数据分析 |

2065

被折叠的 条评论
为什么被折叠?



