大家好,我是飞哥~ 今天咱们聊聊 Shell 里的「文本处理双子星」——cut
和sort
!这俩工具堪称新手入门必备:
分享
三、飞哥总结:cut 与 sort 的最佳拍档场景
场景 | cut 负责 | sort 负责 |
---|---|---|
清洗 CSV 文件 | 提取指定列 | 按某列排序 / 去重 |
处理日志文件 | 提取 IP、状态码等字段 | 按 IP 或状态码排序 |
整理系统文件 | 提取用户 / 权限等信息 | 按用户 ID 或目录排序 |
四、互动时间👇
你平时用 cut 和 sort 处理过哪些数据?有没有遇到过排序错乱或提取失败的问题?评论区留言 “cut 排序”,飞哥抽 3 位同学送《Shell 命令速查手册》电子版!觉得有用的话,点赞 + 收藏 + 关注,后续飞哥会出《awk 与 sed 进阶》,教你用一行命令搞定复杂数据处理~ 咱们下期见! 😎
cut
能按列精准提取数据,比如从 CSV 里捞出你要的某几列;sort
能给数据排序、去重,专治 “乱成一锅粥” 的文本。
学会它们,处理日志、清洗数据、整理表格效率飙升!废话不多说,直接上干货~-
一、cut:按列提取的「手术刀」—— 想切哪里切哪里!
1. 为什么需要 cut?
想象你有个 CSV 文件,里面有姓名、成绩、邮箱等 10 列数据,但你只需要姓名和成绩 —— 这时候
cut
就像一把手术刀,能精准 “切出” 你要的列,比 Excel 筛选还快!2. 基础用法:按分隔符切分(90% 的场景都靠它!)
cut
的核心参数是-d
(指定分隔符)和-f
(指定要提取的列),支持逗号、空格、制表符甚至自定义符号。案例 1:提取 CSV 文件的姓名和数学成绩
假设有个
students.csv
: -
张三,90,85,zhangsan@example.com 李四,85,92,lisi@example.com 王五,92,88,wangwu@example.com
想提取第 1 列(姓名)和第 2 列(数学成绩)?一行命令搞定:
-
cut -F ',' -f 1,2 students.csv # 输出: # 张三,90 # 李四,85 # 王五,92
💡 技巧:
-F ','
表示用逗号分隔,-f 1,2
表示提取第 1 列和第 2 列;n-
表示从第 n 列到行尾(如-f 2-
提取第 2 列及之后所有列);n-m
表示提取第 n 到 m 列(如-f 2-3
提取第 2 到 3 列)。-
案例 2:处理系统用户文件(冒号分隔)
Linux 的
/etc/passwd
用冒号分隔,想提取用户名(第 1 列)和用户 ID(第 3 列): -
cut -F ':' -f 1,3 /etc/passwd # 输出: # root,0 # daemon,1 # bin,2
3. 进阶用法:按字符位置切分(固定格式文本救星!)
如果数据没有分隔符,而是固定宽度(比如 IP 地址、时间戳),可以用
-c
按字符位置提取。 -
案例:提取 IP 地址的前 3 个字符(如
192.168
→192
) -
echo "192.168.1.100" | cut -c 1-3 # 输出:192
案例:提取每行第 5 个字符后的内容
-
cut -c 5- access.log # 提取每行第5个字符到行尾的内容
4. 实战案例:清洗日志中的 IP 和状态码
假设日志格式是:
192.168.1.100 - - [10/May/2024:12:00:00] "GET /api" 200
需要提取 IP(第 1 列)和状态码(第 9 列): -
cut -d ' ' -f 1,9 access.log # 输出:192.168.1.100 200
5. 避坑指南:这 3 个坑别踩!
- 空列报错:如果某行缺少指定列(比如 CSV 某行少个逗号),cut 会报错,加
-s
忽略空列: -
cut -s -F ',' -f 1 students.csv # 忽略没有第1列的行
分隔符转义:如果分隔符是特殊字符(如制表符
\t
),需要用-d $'\t'
指定: -
cut -d $'\t' -f 1 data.tsv # 处理制表符分隔的TSV文件
- 字符位置算错:
-c 1-3
是第 1 到 3 个字符,包含两端,别漏看! -
二、sort:数据整理的「排序机」—— 让数据乖乖排队!
1. 为什么需要 sort?
下载的日志 IP 乱序、成绩表需要按分数排名、重复数据需要去重……
sort
能让数据按你想要的顺序排列,支持字符串、数值、多列排序,堪称 “数据秩序维护者”!2. 基础用法:字符串与数值排序(新手必学!)
案例 1:字符串排序(按字母顺序)
-
echo -e "banana\napple\ncat" | sort # 输出:apple banana cat (按字母A-Z排序)
案例 2:数值排序(必须加
-n
,否则会出错!) -
echo -e "10\n2\n50" | sort # 错误排序(按字符串比,10会排在2前面) # 输出:10 2 50 echo -e "10\n2\n50" | sort -n # 正确排序(按数值大小) # 输出:2 10 50
💡 关键:数值排序一定要加
-n
,否则 Shell 会把数字当字符串比较(比如"10"<"2"
是 True,因为 '1' 的 ASCII 码比 '2' 小)。3. 去重 + 排序:洁癖患者福音
-u
参数去重(保留唯一行),常和-n
搭配处理日志: -
# 从日志中提取IP,去重并按数值排序 cat access.log | cut -d ' ' -f 1 | sort -u -n # 输出:192.168.1.1 192.168.1.2 ...(每个IP只出现一次,按数值从小到大)
4. 进阶用法:多列排序(处理复杂表格)
用
-t
指定分隔符,-k
指定排序的列,适合成绩表、用户信息表等多列数据。案例:按数学成绩倒序排序(第二列)
数据文件
scores.txt
(空格分隔): -
张三 90 85 李四 85 92 王五 92 88
命令:
-
sort -t ' ' -k 2 -r scores.txt # 输出(按第二列数学成绩倒序): # 王五 92 88 # 张三 90 85 # 李四 85 92
💡 解析:
-t ' '
:分隔符是空格;-k 2
:按第 2 列排序;-r
:倒序(默认正序,不加-r
就是从小到大)。-
5. 实战案例:整理成绩表(先按数学升序,再按语文降序)
如果需要多列排序(先排第二列,再排第三列):
-
sort -t ' ' -k 2,2n -k 3,3nr scores.txt # 解释: # -k 2,2n:按第2列(数学)数值升序; # -k 3,3nr:按第3列(语文)数值降序;
6. 避坑指南:这 2 个细节要注意!
- 分隔符不一致:多列排序前,确保数据分隔符统一(比如全用空格或逗号),否则排序会错乱。
- 中文排序问题:sort 默认按 ASCII 码排中文(比如 “张三” 在 “李四” 前面),需要加
-k $'[:locale:]'
按拼音排序(进阶技巧,新手先记住基础用法即可)。