Linux 文本处理四剑客:cut, sort, uniq, tr

1. cut - 按列或字符截取

核心功能:从文本行中提取指定的字段或字符。

选项 说明
-d 指定分隔符(默认是 TAB)
-f 指定要提取的字段 (列),需与 -d 连用
-c 字符截取(推荐用于中文等多字节字符)
-b 字节截取(不推荐用于中文)

示例

复制代码
# 提取 /etc/passwd 文件中的用户名(第一列)
cut -d':' -f1 /etc/passwd

# 提取 UID(第三列)
cut -d':' -f3 /etc/passwd

# 同时提取用户名和 UID(第1和3列)
cut -d':' -f1,3 /etc/passwd

# 提取每行的第2个字符
cut -c 2 name.txt

# 提取每行的第3个字节(对于ASCII字符,结果与-c相同)
who | cut -b 3

⚠️ 重要注意

  • cut 非常适合处理以单一字符 (如 :,、空格)分隔的规整文本。

  • 对于不定长空格 等复杂分隔,建议使用 awk


2. sort - 排序

核心功能:对文本行进行排序,默认按行首字符的字典序升序排列。

选项 说明
-t 指定分隔符
-k 指定根据哪个字段进行排序
-n 数值大小排序(而非字典序)
-r 降序排序(Reverse)
-u 去重(输出中重复的行只出现一次)
-o 将排序结果输出到文件(可覆盖原文件)

示例

复制代码
# 默认按第一列字典序排序
sort passwd.txt

# 按第三列(UID)的数值大小进行升序排序
sort -t':' -k3 -n passwd.txt

# 按第三列数值大小进行降序排序
sort -t':' -k3 -nr passwd.txt

# 去重
sort -u passwd.txt

# 排序并保存结果到 out.txt
sort -nr -t: -k3 passwd.txt -o out.txt

3. uniq - 报告或忽略重复的行

核心功能 :用于去除连续 的重复行。必须 先使用 sort 使所有重复行相邻,才能实现全局去重。

选项 说明
-c 在每行前加上该行的重复次数
-d 仅显示重复过的行(每组重复行只显示一次)
-u 仅显示未曾重复的行(唯一行)

示例

假设 fruit.txt 内容如下:

复制代码
apple
apple
peache
pear
banana
cherry
cherry
banana
orange
复制代码
# 1. 直接使用uniq:只能去除相邻的重复行
uniq fruit.txt

# 2. 全局去重:先排序,让所有重复行相邻
sort fruit.txt | uniq

# 3. 统计每行出现的次数(非常常用!)
sort fruit.txt | uniq -c

# 4. 只找出重复的水果种类
sort fruit.txt | uniq -d

# 5. 只找出独一无二的水果种类
sort fruit.txt | uniq -u

实战示例

复制代码
# 查看当前所有登录用户(去重)
who | awk '{print $1}' | sort | uniq

# 查看历史上所有登录过系统的用户
last | awk '{print $1}' | sort | uniq | grep -vE "(^$|wtmp)"

4. tr - 字符转换、压缩和删除

核心功能 :对来自标准输入的字符进行替换删除压缩处理对象是字符,不是字段

选项 说明
-d 删除字符
-s 压缩连续重复的字符,只保留一个

示例

复制代码
# 将文件中所有小写字母转换为大写
cat fruit.txt | tr 'a-z' 'A-Z'
# 或
tr 'a-z' 'A-Z' < fruit.txt

# 字符替换:将所有的 'a' 替换成 '/'
tr 'a' '/' < fruit.txt

# 删除所有字母 'a'
tr -d 'a' < fruit.txt

# 删除换行符(让多行变一行)
tr -d '\n' < fruit.txt

# 压缩连续的空格(常用于规范文本)
echo "Hello    World" | tr -s ' '

# 错误示例:tr 是字符一对一映射,不是单词替换
# 这会把 'a','p','l','e' 分别映射为 's','t','a','r',结果会很乱
cat fruit | tr 'apple' 'star'

5. 案例

① 统计当前服务器的网络连接数(按 IP 地址)

复制代码
ss -nt | tr -s ' ' | cut -d ' ' -f5 | cut -d: -f1 | sort | uniq -c
  • ss -nt:列出所有 TCP 连接(不解析服务名)。

  • tr -s ' ':压缩多个空格为一个,规范输出。

  • cut -d ' ' -f5:提取第五列(远程地址:端口)。

  • cut -d: -f1:提取冒号前的第一部分(IP 地址)。

  • sort:排序,为 uniq 做准备。

  • uniq -c:统计每个 IP 的连接数。

② 统计当前主机的各种 TCP 连接状态数量

复制代码
ss -nta | grep -v '^State' | cut -d' ' -f1 | sort | uniq -c
  • ss -nta:显示所有 TCP 连接和状态。

  • grep -v '^State':过滤掉标题行。

  • cut -d' ' -f1:提取第一列(状态)。

  • sort | uniq -c:统计每种状态的数量。

相关推荐
kebeiovo14 小时前
Linux 环境配置 Boost 库详细步骤
linux·运维·服务器
MicrosoftReactor15 小时前
技术速递|构建你的第一个 MCP 服务器:如何使用自定义功能扩展 AI 工具
运维·服务器·人工智能
mljy.15 小时前
Linux《进程信号(上)》
linux
泽虞15 小时前
《LINUX系统编程》笔记p8
linux·运维·服务器·c语言·笔记·面试
正在努力的小河18 小时前
Linux并发与竞争
linux·运维·服务器
三坛海会大神55518 小时前
正则表达式与grep文本过滤详解
linux·运维·正则表达式
fuyongliang12318 小时前
Linux 正则表达式与grep命令
服务器·数据库·mysql
码农hbk20 小时前
Linux signal 图文详解(二)信号发送
linux·服务器
東雪蓮☆20 小时前
Shell 编程 —— 正则表达式与文本处理实战
linux·运维·服务器