Shell文本处理四剑客
目录
1. cut —— 按列或字符截取
2. sort —— 排序(默认按行首字符升序)
3. uniq —— 去除 连续 重复
4. tr —— 字符替换 / 删除 / 压缩重复
5. 常见组合面试题 扩展
① 统计当前连接的主机数
② 统计当前主机的连接状态
③ 查看当前登录用户
④ 查看登录过系统的用户
6. 总结口诀
1. cut —— 按列或字符截取
常用于从文本中抽取需要的字段。
-
常用选项
-
-b
:按字节截取 -
-c
:按字符截取(中文推荐用-c
) -
-d
:指定分隔符(默认 TAB) -
-f
:指定字段(需配合-d
)
-
-
示例
cut -d':' -f1 /etc/passwd # 截取第1列(用户名)cut -d':' -f3 /etc/passwd # 截取第3列(UID)
cut -d':' -f1,3 /etc/passwd # 截取第1和3列
cut -c 2 name.txt # 截取第2个字符
who | cut -b 3 (英语用b)
who | cut -c 3 (中文推荐用c) cat name | cut -b 2 cat name | cut -c 2 #中文字符截取
注意:cut只擅长于处理单个字符为间隔的文本
2. sort —— 排序(默认按行首字符升序)
-
常用选项
-
-t
:指定分隔符 -
-k
:指定排序字段 -
-n
:按数值排序(默认是字典序) -
-r
:降序 -
-u
:去重(等价于uniq
) -
-o
:输出到文件
-
-
示例
sort passwd.txt # 按第一列升序sort -n -t: -k3 passwd.txt # 以冒号分隔,按第3列数值升序
sort -nr -t: -k3 passwd.txt # 第3列数值降序
sort -u passwd.txt # 去重
sort -nr -t: -k3 passwd.txt -o out.txt # 排序结果保存
3. uniq —— 去除 连续 重复
注意:只能去掉相邻的重复行,所以通常先 sort
再 uniq
。
语法 uniq [选项] 参数
-
常用选项
-
-c
:对重复的行进行计数 -
-d
:只显示重复行 -
-u
:只显示唯一行
-
-
示例
##创建一个水果类型的文件,一共9行内容实例 cat fruit.txt apple apple peache pear banana cherry cherry banana orange uniq fruit.txt # 去掉相邻重复行
sort fruit.txt | uniq # 全局去重
sort fruit.txt | uniq -c # 统计每行出现次数
sort fruit.txt | uniq -d # 只显示重复行
sort fruit.txt | uniq -u # 只显示不重复行 或者这样写 cat fruit.txt | sort | uniq -u
实战 查看登录用户 示例一 who | awk '{print $1}'| uniq
示例二 查看登陆过系统的用户 last | awk '{print $1}' | sort | uniq | grep -v "^$" | grep -v wtmp
4. tr —— 字符替换 / 删除 / 压缩重复
主要用于 单个字符处理,不适合字段级别。
语法 用法:tr [选项]… SET1 [SET2] 从标准输入中替换、缩减和/或删除字符,并将结果写到标准输出。
-
常用选项
-
-d
:删除字符 -
-s
:压缩重复字符,只保留一个
-
-
示例
tr 'a-z' 'A-Z' < fruit.txt # 小写转大写 或cat fruit.txt | tr 'a-z' 'A-Z'cat fruit.txt | tr 'apple' 'APPLE' #替换是一一对应的字母的替换
cat fruit.txt | tr 'a' ' ' #把替换的字符用单引号引起来,包括特殊字
cat fruit.txt | tr 'apple' 'star' #a替换成s,p替换成a,le替换成r
tr 'a' '/' < fruit.txt # 替换 a -> / 多个字符替换成一个
tr -d 'a' < fruit.txt # 删除所有 a
tr -d '\n' < fruit.txt # 删除换行符
tr -s 'p' < fruit.txt # 连续 p 压缩成一个
5. 常见组合面试题 扩展
① 统计当前连接的主机数
ss -nt | tr -s " " | cut -d " " -f5 | cut -d ":" -f1 | sort | uniq -c ============================================= ss -nt ss:查看 socket 连接 -n:不解析服务名,直接显示端口号(避免 http 变成 80 之类的) -t:只显示 TCP 连接tr -s " " 把多个空格压缩成一个,方便后续 cut。输出变成规则的单空格分隔。cut -d " " -f5以空格为分隔符,取第 5 列(即 对端地址:端口)cut -d ":" -f1以冒号分隔,取第 1 段(只要 对端 IP,去掉端口 sort排序,保证相同的 IP 连续排列。 uniq -c统计重复行数量(即同一个 IP 出现多少次
② 统计当前主机的连接状态
ss -nta | grep -v '^State' | cut -d" " -f1 | sort | uniq -c
③ 查看当前登录用户
who | awk '{print $1}' | uniq
④ 查看登录过系统的用户
last | awk '{print $1}' | sort | uniq | grep -v "^$" | grep -v wtmp
6. 总结口诀
-
cut —— 截列
-
sort —— 排序
-
uniq —— 去重(必须连续,常和 sort 联合)
-
tr —— 替换 / 删除 / 压缩