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 管道处理神器
相关推荐
byoass3 分钟前
自动化任务系列之二:批量建目录树——Excel模板驱动千人项目初始化
运维·网络·安全·自动化·云计算
脆皮炸鸡7554 分钟前
Linux~~基础IO
linux·运维·服务器·经验分享·算法·学习方法
众少成多积小致巨9 分钟前
Android 初始化语言入门
android·linux·c++
思麟呀10 分钟前
在Select的基础上学习poll
linux·网络·学习·tcp/ip
wuyoula20 分钟前
尹之盾企业版网络验证
服务器·开发语言·javascript·c++·人工智能·ui·c#
喜欢吃燃面23 分钟前
Linux 信号保存机制深度解析:从内核数据结构到进程状态管理
linux·运维·数据结构·学习
云边有个稻草人31 分钟前
【Linux系统】第十节—【进程概念】环境变量 | 详解,包会!
linux·环境变量·命令行参数·环境变量的特性·获取linux环境变量的方法·环境变量path·通过代码获取linux环境变量
IMPYLH37 分钟前
Linux 的 stdbuf 命令
linux·运维·服务器·bash
郝学胜-神的一滴39 分钟前
从底层看透Linux高性能服务器:epoll自定义封装与超时清理实战
linux·服务器·c++·网络协议·tcp/ip·unix
Elastic 中国社区官方博客40 分钟前
Elasticsearch 多年来的演进 —— LogsDB 如何在不影响吞吐量的情况下将索引大小减少高达 75%
大数据·运维·elasticsearch·搜索引擎·全文检索·可用性测试