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 管道处理神器
相关推荐
源图客1 天前
CentOS系统安装Python3.12.10
linux·运维·centos
阿蔹1 天前
泰和昌商城接口自动化项目框架介绍
运维·自动化
立夏陆之昂1 天前
Ubuntu下安装easyconnect
linux·ubuntu
运维之美@1 天前
linux主机ping不通问题排查
linux·运维·服务器
MyCollege19991 天前
以UEFI模式从U盘安装centos遇到空间不足
linux·运维·centos
草木红1 天前
Docker 和 portainer 安装
运维·docker·容器·portainer
kylezhao20191 天前
C# 写一个Http 服务器和客户端
服务器·http·c#
optimistic_chen1 天前
【Redis系列】Java操作Redis客户端
java·linux·redis·客户端·服务端
Tfly__1 天前
Ubuntu20.04安装Genesis(最新)
linux·人工智能·pytorch·ubuntu·github·无人机·强化学习