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
:统计每种状态的数量。