# Shell 文本处理三剑客:awk、sed 与常用小工具详解

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


一、awk:文本分析工具

1. 概述

AWK 是一种强大的文本处理语言,适用于扫描、过滤、统计和格式化文本输出。其名称来源于三位创始人姓氏的首字母:Alfred Aho、Peter Weinberger 和 Brian Kernighan。

2. 工作原理

  • 逐行读取输入(文件、管道或标准输入)
  • 按指定分隔符(默认为空格或制表符)分割每行为多个字段
  • 根据模式匹配执行相应动作
  • 支持变量、条件判断、循环等编程结构

3. 基本语法

awk [选项] '模式 { 动作 }' 文件

4. 常用内置变量

变量 说明
$0 当前整行内容
$1, $2… 第1、2…个字段
NF 当前行的字段数
NR 当前行号
FS 输入字段分隔符(默认空格)
OFS 输出字段分隔符(默认空格)
FILENAME 当前文件名

5. 实战示例

① 打印指定列
awk -F: '{print $1,$3}' /etc/passwd   # 以冒号分隔,输出第1和第3列

在这里插入图片描述

② 条件过滤
awk -F: '$3 >= 1000 {print $1}' /etc/passwd   # 输出UID≥1000的用户名

在这里插入图片描述

③ 统计行数
awk 'END{print NR}' /etc/passwd   # 打印总行数

在这里插入图片描述

④ 使用 BEGIN 和 END
awk 'BEGIN{FS=":";OFS="--"} {print $1,$NF} END{print "处理结束"}' /etc/passwd

在这里插入图片描述

二、sed:流编辑器

1. 概述

sed 用于对文本进行流式编辑,支持查找、替换、删除、插入等操作,适用于自动化脚本和批量处理。

2. 工作原理

  • 逐行读取文本到模式空间(pattern space)
  • 按脚本指令处理文本
  • 将结果输出到标准输出
  • 默认不修改原文件(除非使用 -i 选项)

3. 常用选项

选项 说明
-n 禁止默认输出
-e 执行多条命令
-f 从文件读取命令
-i 直接修改原文件
-r 使用扩展正则表达式

4. 常用命令

命令 说明
s 替换
d 删除
p 打印
a 在行后插入
i 在行前插入
c 替换整行

5. 实战示例

① 替换文本
sed 's/old/new/g' file.txt          # 全局替换
sed -i 's/old/new/g' file.txt       # 直接修改原文件
② 删除行
sed '1,5d' file.txt                 # 删除1~5行
sed '/pattern/d' file.txt           # 删除匹配行
③ 插入内容
sed '3a\插入的内容' file.txt        # 在第3行后插入
sed '/pattern/i\插入的内容' file.txt # 在匹配行前插入
④ 提取IP地址
ifconfig ens33 | sed -rn '2s/.*inet ([0-9.]+).*/\1/p'

案例:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、常用文本处理小工具

1. cut:按列截取

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

在这里插入图片描述在这里插入图片描述截取第9列的字符
截取第1和9列的字符
截取第1-9列的字符
截取第1列

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:去重(需先排序)

  • -c:对重复的行进行计数
  • -d:只显示重复行
  • -u:只显示唯一行
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

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. tr:字符替换/删除

  • -d:删除字符
  • -s:压缩重复字符,只保留一个
tr 'a-z' 'A-Z' < l.sh           # 小写转大写
或cat l.sh | tr 'a-z' 'A-Z'
cat fruit | tr 'apple' 'APPLE'       #替换是一一对应的字母的替换
cat l.sh | tr 'a' ' '               #把替换的字符用单引号引起来,包括特殊字
cat l.sh | tr 'apple' 'star'        #a替换成s,p替换成a,le替换成r
tr 'a' '/' < l.sh              # 替换 a -> /   多个字符替换成一个

tr -d 'a' < l.sh                # 删除所有 a
tr -d '\n' < l.sh               # 删除换行符
tr -s 'p' < l.sh                # 连续 p 压缩成一个

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、生产环境综合应用

1. SS

ss -nt | tr -s " " | cut -d " " -f5 | cut -d: -f1 | sort | uniq -c  #统计当前连接主机数
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 #查看登录过的用户

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、总结对比

工具 适用场景 特点
awk 复杂字段处理、统计、格式化输出 支持编程结构,功能强大
sed 流式编辑、替换、删除、插入 轻量高效,适合批量处理
cut 按列截取 简单快捷,适合固定格式
sort 排序 支持数值和字典序
uniq 去重(需先排序) 只能处理相邻重复行
tr 字符替换、删除、压缩 只能处理单个字符

如有疑问或进一步需求,欢迎在评论区留言!


网站公告

今日签到

点亮在社区的每一天
去签到