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}
避免数据丢失。
- 使用