Linux 文本处理工具详解
一、符号说明
| 符号 | 说明 |
|---|---|
^ | 匹配行首(如 ^abc 表示以 abc 开头的行) |
$ | 匹配行尾(如 xyz$ 表示以 xyz 结尾的行) |
.* | 匹配任意字符(正则表达式通配符) |
\ | 转义符(如 \$ 表示普通字符 $) |
| ` | 管道符,将前一个命令的输出作为后一个命令的输入 |
> / >> | 重定向符(覆盖写入 / 追加写入) |
创建/追加文件内容
# 覆盖写入文件(清空原有内容)
echo "Hello World" > file.txt
# 追加内容到文件末尾
echo "New Line" >> file.txt
# 多行输入(EOF 可自定义为其他结束符)
cat << EOF > file.txt
Line 1
Line 2
EOF
二、常用工具及命令
1. sed 流编辑器
常用参数:
-i:直接修改文件(建议配合备份,如-i.bak)-e:执行多个命令-n:抑制默认输出(常与p命令配合)
高频命令:
# 全局替换文本(直接修改文件)
sed -i 's/old/new/g' file.txt
# 删除包含 "error" 的行
sed '/error/d' file.txt
# 替换第2行的内容
sed '2c New Content' file.txt
# 在匹配行后追加内容
sed '/pattern/a\Appended Line' file.txt
# 打印第5到10行
sed -n '5,10p' file.txt
#替换多处内容使用-e
sed -e 's/匹配的内容/替换的内容/' -e 's/匹配的内容/替换的内容/' 文件
#替换一行并追加一行
sudo sed -i '/^匹配以x开头的行/ {
s/匹配的内容/替换的内容/
a\追加的内容
}' file.txt
#替换整行内容
sed -i '/匹配的内容/c\替换的内容' file.txt
低频操作:
: 标签跳转:配合b(跳转)和t(条件跳转)实现复杂逻辑保持空间(hold space):用h,H,g,G操作暂存数据
2. grep 文本搜索
常用参数:
-i:忽略大小写-v:反向匹配(排除匹配行)-n:显示行号-E:启用扩展正则表达式-r:递归搜索目录
高频命令:
# 搜索包含 "error" 的行(显示行号)
grep -n "error" log.txt
# 排除空行和注释行(假设注释以 # 开头)
grep -vE '^$|^#' config.conf
# 递归搜索目录中所有文件
grep -r "keyword" /path/to/dir
# 统计匹配行数
grep -c "pattern" file.txt
低频操作:
-L:列出不包含匹配项的文件名-Z:输出以 NULL 字符分隔(配合xargs -0处理含空格文件名)
3. awk 文本分析
常用参数:
-F:指定字段分隔符(默认空格/TAB)-v:定义变量(如-v var=value)
高频命令:
# 打印第1列和第3列(逗号分隔)
awk -F',' '{print $1, $3}' data.csv
# 统计文件行数
awk 'END {print NR}' file.txt
# 过滤第3列大于100的行
awk '$3 > 100 {print $0}' data.txt
# 计算第1列的总和
awk '{sum += $1} END {print sum}' numbers.txt
# 自定义输出格式(如添加表头)
awk 'BEGIN {print "Name\tAge"} {print $1, $2}' users.txt
低频操作:
BEGIN/END块:处理数据前/后执行的操作内置函数:如substr($0,1,5)截取字符串,gsub(/old/, "new")全局替换
4. cut 列截取
常用参数:
-d:指定分隔符(默认 TAB)-f:选择字段(如-f1,3或-f2-5)-c:按字符位置截取
高频命令:
# 截取第2列(逗号分隔)
cut -d',' -f2 data.csv
# 截取每行前5个字符
cut -c1-5 file.txt
# 结合管道处理数据
echo "John:Doe:30" | cut -d':' -f1,3 # 输出 John:30
低频操作:
--complement:反选字段(排除指定列)
5. sort 排序
常用参数:
-n:按数值排序-r:逆序排序-k:指定排序字段(如-k2按第2列排序)-u:去重后排序
高频命令:
# 按数值逆序排序
sort -nr numbers.txt
# 按第3列排序(逗号分隔)
sort -t',' -k3 data.csv
# 合并并去重两个文件
sort -u file1.txt file2.txt
低频操作:
-T:指定临时目录(处理大文件时避免磁盘空间不足)
三、组合使用示例
1. 统计日志中不同错误类型的数量
grep "ERROR" app.log | awk '{print $4}' | sort | uniq -c | sort -nr
grep过滤错误行 →awk提取错误类型 →sort排序 →uniq统计 → 按数量逆序排序
2. 批量重命名文件
ls *.txt | sed 's/\.txt$/_backup&/' | xargs -I {} mv {}
ls列出文件 →sed修改文件名 →xargs传递新文件名
四、注意事项
- 正则表达式差异:
grep默认使用基础正则,sed和awk支持扩展正则(需加-E或-r)。
- 性能优化:
- 处理大文件时,优先使用流式工具(如
sed/awk),避免cat加载整个文件。
- 处理大文件时,优先使用流式工具(如
- 备份文件:
- 使用
sed -i.bak或cp file.txt{,.bak}避免数据丢失。
- 使用
文章介绍了如何在Linux环境中使用shell命令sed对文件进行操作,包括当文件为空时如何替换字符,如何覆盖或追加内容,以及如何定位特定行进行替换。还详细讲解了如何指定某行替换和全字匹配替换的语法,以及在文件末尾添加新行的方法。

210

被折叠的 条评论
为什么被折叠?



