Linux文本处理工具完全指南:cut、sort、uniq、tr、sed与awk详解

发布于:2025-09-03 ⋅ 阅读:(19) ⋅ 点赞:(0)

目录

  1. ​命令小工具​

    • 1.1 cut - 按列或字符截取
    • 1.2 sort - 排序
    • 1.3 uniq - 去除连续重复行
    • 1.4 tr - 字符替换/删除/压缩
    • 1.5 常见组合面试题
    • 1.6 总结口诀
  2. ​sed流编辑器​

    • 2.1 sed是什么
    • 2.2 sed的原理
    • 2.3 sed命令常见用法
    • 2.4 生产扩展案例
  3. ​shell-awk命令详解​

    • 3.1 概述
    • 3.2 工作原理
    • 3.3 工作流程
    • 3.4 基本语法
    • 3.5 实战案例
    • 3.6 总结

1. 命令小工具

1.1 cut - 按列或字符截取

cut 用于从文本中抽取需要的字段,适合处理结构化文本。

​常用选项​​:

  • -b:按字节截取
  • -c:按字符截取(推荐处理中文)
  • -d:指定分隔符(默认TAB)
  • -f:指定字段(需配合 -d

​示例​​:

# 截取/etc/passwd的用户名和UID
cut -d':' -f1,3 /etc/passwd

# 截取每行第2个字符
cut -c2 name.txt

​注意​​:cut擅长处理单个字符为间隔的文本,处理复杂格式时建议使用awk。


1.2 sort - 排序

sort 默认按行首字符升序排列。

​常用选项​​:

  • -t:指定分隔符
  • -k:指定排序字段
  • -n:按数值排序
  • -r:降序
  • -u:去重
  • -o:输出到文件

​示例​​:

# 按UID数值降序排列
sort -nr -t: -k3 /etc/passwd

# 去重并保存结果
sort -u passwd.txt -o sorted.txt

1.3 uniq - 去除连续重复行

​重要​​:只能去掉相邻的重复行,常与sort配合使用。

​常用选项​​:

  • -c:对重复行计数
  • -d:只显示重复行
  • -u:只显示唯一行

​示例​​:

# 统计每种水果出现次数
sort fruit.txt | uniq -c

# 查看系统登录用户
who | awk '{print $1}' | uniq

1.4 tr - 字符替换/删除/压缩

主要用于单个字符处理。

​常用选项​​:

  • -d:删除字符
  • -s:压缩重复字符

​示例​​:

# 小写转大写
cat file.txt | tr 'a-z' 'A-Z'

# 删除所有数字
tr -d '0-9' < data.txt

# 压缩连续空格
echo "hello    world" | tr -s ' '

1.5 常见组合面试题

​① 统计当前连接的主机数​

ss -nt | tr -s " " | cut -d " " -f5 | cut -d: -f1 | sort | uniq -c

​解析​​:

  1. ss -nt:获取TCP连接
  2. tr -s " ":压缩多个空格
  3. 两次cut提取IP
  4. sort | uniq -c:统计IP出现次数

​② 查看登录过系统的用户​

last | awk '{print $1}' | sort | uniq | grep -v "^$" | grep -v wtmp

1.6 总结口诀

  • ​cut​​ - 截列
  • ​sort​​ - 排序
  • ​uniq​​ - 去重(必须连续)
  • ​tr​​ - 替换/删除/压缩

2. sed流编辑器

2.1 sed是什么

sed是专门为文本处理设计的​​流编辑器​​,主要功能:

  • 自动编辑一个或多个文件
  • 简化对文件的反复操作
  • 编写转换程序

2.2 sed的工作原理

​工作流程​​:

  1. 读取一行到​​模式空间​
  2. 按顺序执行命令
  3. 输出处理后的内容
  4. 清空模式空间,重复上述过程

​注意​​:默认情况下处理结果不修改源文件,除非使用 -i 选项。

2.3 sed命令常见用法

​基本语法​​:

sed [选项] '操作' 文件
sed [选项] -f 脚本文件 文件

​常用选项​​:

选项 含义
-e 多次编辑
-n 取消默认输出
-i 直接修改源文件
-r 使用扩展正则表达式

​操作命令​​:

命令 含义
p 打印
d 删除
i 在行前插入内容
a 在行后插入内容
c 替换整行
s 搜索替换(最常用)

​示例​​:

# 打印含"root"的行
sed -n '/root/p' /etc/passwd

# 替换所有"apple"为"APPLE"
sed 's/apple/APPLE/g' fruit.txt

# 删除空行
sed '/^$/d' file.txt

# 在第三行后插入内容
sed '3a New Content' file.txt

2.4 生产扩展案例

​案例1:修改IP地址​

sed -i 's/^IPADDR=.*/IPADDR=192.168.10.100/' /etc/sysconfig/network-scripts/ifcfg-ens33

​案例2:调整vsftpd配置​

#!/bin/bash
SAMPLE="/usr/share/doc/vsftpd/EXAMPLE/vsftpd.conf"
CONFIG="/etc/vsftpd/vsftpd.conf"

# 备份配置
[! -e "$CONFIG.bak"] && cp $CONFIG $CONFIG.bak

# 禁止匿名用户,允许本地用户写入
sed -e '/^anonymous_enable/s/YES/NO/g' $SAMPLE > $CONFIG
sed -i -e '/^local_enable/s/NO/YES/g' -e '/^write_enable/s/NO/YES/g' $CONFIG

# 重启服务
systemctl restart vsftpd

3. shell-awk命令详解

3.1 概述

​AWK​​ 是强大的文本分析工具,特点:

  • 专门为文本处理设计的编程语言
  • 行处理软件,用于扫描、过滤、统计
  • 数据可来自标准输入、管道或文件
  • Linux系统常用的是gawk(GNU awk)

3.2 工作原理

​执行流程​​:

  1. ​读(Read)​​:读取一行数据
  2. ​执行(Execute)​​:执行awk命令
  3. ​重复(Repeat)​​:循环直到文件结束

3.3 工作流程

​标准结构​​:

awk 'BEGIN{开始块} pattern{主体块} END{结束块}' 文件
  • ​BEGIN块​​:处理前执行一次(初始化变量)
  • ​主体块​​:每行都执行
  • ​END块​​:处理后执行一次(汇总结果)

3.4 基本语法

​内置变量​​:

变量 含义
FS 输入字段分隔符(默认空格)
OFS 输出字段分隔符
RS 输入行分隔符(默认\n)
ORS 输出行分隔符
NF 当前行的字段数
NR 当前行号
FNR 各文件分别计数的行号
$0 整行内容
$n 第n个字段

3.5 实战案例

​基础操作​​:

# 打印用户名和登录shell
awk -F: '{print $1,$7}' /etc/passwd

# 统计行数
awk 'END{print NR}' file.txt

# 显示文件最后一行
awk 'END{print $0}' file.txt

​高级应用​​:

# 获取本机IP
ifconfig ens33 | awk '/netmask/{print $2}'

# 统计内存使用率
free -m | awk '/Mem:/ {print int($3/($3+$4)*100)"%"}'

# 统计IP访问次数
awk '{ip[$1]++} END{for(i in ip) print ip[i],i}' /var/log/nginx/access.log

​安全监控脚本​​:

#!/bin/bash
# 分析登录失败记录
log_data=$(awk '/Failed password/{ip[$(NF-3)]++} END{for(i in ip) print i,ip[i]}' /var/log/secure)

# 报警处理
echo "$log_data" | while read ip count; do
  if [ $count -ge 3 ]; then
    echo "警告! $ip 访问失败 $count 次!" | mail -s "安全警报" admin@example.com
  fi
done

3.6 总结

​工具对比​​:

工具 最佳用途 特点
grep 文本过滤 简单匹配
sed 流编辑 适合编辑匹配的文本
awk 格式化文本输出 复杂文本处理
cut 按列截取 简单结构化数据
sort 排序 数据整理
uniq 去重 需配合sort
tr 字符替换/删除 单个字符处理

​核心要点​​:

  1. ​组合使用​​:管道连接多个命令 (e.g., sort | uniq)
  2. ​备份操作​​:修改文件前备份 (sed -i.bak)
  3. ​性能考量​​:大文件处理用awk代替while read
  4. ​安全审计​​:定期分析日志 (/var/log/secure, access_log)
  5. ​脚本测试​​:生产环境前充分验证

掌握这些工具的组合应用,可以高效解决95%的Linux文本处理需求。实际工作中建议多积累实用代码片段,建立个人工具箱。