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 管道处理神器
相关推荐
A小辣椒1 天前
TShark:Wireshark CLI 功能
linux
A小辣椒1 天前
TShark:基础知识
linux
AlfredZhao2 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao2 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334662 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪2 天前
linux 拷贝文件或目录到指定的位置
linux
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
bush43 天前
嵌入式linux学习记录十四、术语
linux·嵌入式