Linux 相关

我帮你把 sed / awk / xargs 这三大 Unix 文本处理神器整理成一张清晰的对照表,附带使用场景、核心用法和示例,非常适合做笔记。


工具 核心功能 输入方式 输出方式 常用场景 简单示例 备注
sed 流式文本编辑器(Stream Editor) stdin / 文件 stdout(可 -i 修改文件) 替换、删除、插入文本 `echo "hello world" sed 's/world/Go/'hello Go`
awk 文本分析与报告 stdin / 文件 stdout 按字段处理、统计、条件筛选 `echo "1 2 3" awk '{print $2}'2`
xargs 将标准输入转换为命令参数 stdin 执行命令 批量执行命令 `echo a b xargs mkdir` → 创建目录 a 和 b

核心对比思路

特点 sed awk xargs
是否修改文件 可(-i) 否(主要处理输出) 否(执行命令)
是否按字段处理
是否执行外部命令 可(system()) 是(将 stdin 作为参数传给命令)
适合 批量文本替换、插入、删除 表格文本处理、统计、字段提取 批量执行命令、构建命令参数列表

使用场景对比

任务 推荐工具
文件中替换字符串 sed
提取列 / 统计数字 awk
批量删除 tag / 批量 mv / 批量 rm xargs
grep 过滤后执行命令 xargs
按列做运算 awk
替换 + 保存原文件 sed -i

示例合集(实战笔记风格)

bash 复制代码
####################################
# 1️⃣ sed 示例集:流式文本编辑器
####################################

# 替换单词(只替换第一个匹配)
echo "hello world" | sed 's/world/Go/'
# 输出: hello Go

# 替换所有匹配
echo "foo foo foo" | sed 's/foo/bar/g'
# 输出: bar bar bar

# 删除包含某个单词的行
echo -e "apple\nbanana\ncherry" | sed '/banana/d'
# 输出:
# apple
# cherry

# 在每行开头加前缀
echo -e "a\nb\nc" | sed 's/^/line-/'
# 输出:
# line-a
# line-b
# line-c

# 修改文件内容(原地修改)
# sed -i 's/foo/bar/g' test.txt
# 注意:macOS 需要写成 sed -i '' 's/foo/bar/g' test.txt


####################################
# 2️⃣ awk 示例集:按字段分析文本
####################################

# 打印第 2 列
echo -e "1 2 3\n4 5 6" | awk '{print $2}'
# 输出:
# 2
# 5

# 条件筛选(打印第二列大于1的第一列)
echo -e "a 1\nb 2\nc 3" | awk '$2>1 {print $1}'
# 输出:
# b
# c

# 统计第二列的和
echo -e "10 20\n30 40" | awk '{sum+=$2} END {print sum}'
# 输出: 60

# 字符串匹配
echo -e "foo\nbar\nfoobar" | awk '/foo/ {print $0}'
# 输出:
# foo
# foobar

# 多字段运算
echo "3 4" | awk '{print $1*$2}'
# 输出: 12


####################################
# 3️⃣ xargs 示例集:批量命令执行
####################################

# 简单批量删除文件
# echo "a.txt b.txt" | xargs rm

# find + xargs 删除所有 .log 文件
# find . -name "*.log" | xargs rm

# 每次执行一个参数
echo "file1 file2 file3" | xargs -n 1 echo
# 输出:
# file1
# file2
# file3

# 占位符 -I
echo "v1.0 v1.1" | xargs -I {} echo git tag -d {}
# 输出:
# git tag -d v1.0
# git tag -d v1.1

# 处理空格/特殊字符
# find . -name "*.txt" -print0 | xargs -0 rm


####################################
# 4️⃣ sed + awk + xargs 组合实战
####################################

# 删除所有以 v1. 开头的 Git tag
git tag | grep 'v1\.' | xargs -I {} git tag -d {}
# 步骤解释:
# 1. git tag -> 列出所有 tag
# 2. grep 'v1\.' -> 筛选 v1 开头的 tag
# 3. xargs -I {} git tag -d {} -> 批量删除

# 批量重命名文件,加前缀 new_
ls *.txt | awk '{print "new_"$0}' | xargs -n 1 echo mv
# 输出示例:
# mv new_file1.txt
# mv new_file2.txt
# 实际执行去掉 echo 即可:
# ls *.txt | awk '{print "new_"$0}' | xargs -n 1 mv

####################################
# 5️⃣ 小结
####################################
# sed -> 按行替换/删除/插入文本
# awk -> 按字段分析/统计/条件筛选
# xargs -> stdin -> 批量命令参数
# 三者组合是 Unix 管道处理神器
相关推荐
chlk12320 小时前
Linux文件权限完全图解:读懂 ls -l 和 chmod 755 背后的秘密
linux·操作系统
舒一笑20 小时前
Ubuntu系统安装CodeX出现问题
linux·后端
改一下配置文件21 小时前
Ubuntu24.04安装NVIDIA驱动完整指南(含Secure Boot解决方案)
linux
碳基沙盒21 小时前
OpenClaw 多 Agent 配置实战指南
运维
深紫色的三北六号1 天前
Linux 服务器磁盘扩容与目录迁移:rsync + bind mount 实现服务无感迁移(无需修改配置)
linux·扩容·服务迁移
SudosuBash1 天前
[CS:APP 3e] 关于对 第 12 章 读/写者的一点思考和题解 (作业 12.19,12.20,12.21)
linux·并发·操作系统(os)
哈基咪怎么可能是AI2 天前
为什么我就想要「线性历史 + Signed Commits」GitHub 却把我当猴耍 🤬🎙️
linux·github
十日十行3 天前
Linux和window共享文件夹
linux
Sinclair3 天前
简单几步,安卓手机秒变服务器,安装 CMS 程序
android·服务器
木心月转码ing3 天前
WSL+Cpp开发环境配置
linux