飞哥带你玩转 cut 与 sort!Shell 文本处理入门必学的两个神器

大家好,我是飞哥~ 今天咱们聊聊 Shell 里的「文本处理双子星」——cutsort!这俩工具堪称新手入门必备:

分享

三、飞哥总结: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:]'按拼音排序(进阶技巧,新手先记住基础用法即可)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值