在 Linux 环境下处理文本,“增删改查”不再局限于数据库的专用术语,而是渗透在日常的命令行操作中。得益于一大批专为行处理和文本流设计的小工具,你可以在不打开编辑器的情况下完成绝大多数文本转换工作。
1. 查:精准定位内容
查找是其他一切操作的前提。最常用的查找工具是 grep,它从文件或管道流中筛选出匹配指定模式的行。
grep "ERROR" /var/log/app.log # 查找包含 ERROR 的行
grep -i "error" file.txt # 忽略大小写
grep -v "DEBUG" file.log # 排除匹配的行
grep -n "function" main.c # 显示行号
grep -r "config" /etc/ # 递归搜索目录下所有文件
如果需要处理更复杂的字段定位,awk 则是更精细的工具。例如,输出日志中第 3 列值大于 100 的行:
awk '$3 > 100' data.log
2. 增:插入、追加与生成
文本的“增”通常指在特定位置添加新行或新内容。
- 用
echo和重定向快速追加一行到文件末尾:
echo "192.168.1.10 server1" >> /etc/hosts
- 用
sed在匹配行之前(i)或之后(a)插入内容:
sed -i '/^Listen 80$/a Listen 8080' httpd.conf # 在 Listen 80 行后添加一行
sed -i '1i # 这是新增的注释行' config.ini # 在第一行前插入
- 用
cat和 here-document 批量生成多行文本:
cat > newfile.txt << EOF
第一行内容
第二行内容
EOF
3. 删:删除行或过滤内容
删除操作本质上就是“不输出”不需要的行,通常通过反向过滤或 sed 的删除命令完成。
- 删除匹配的行(
sed的d命令):
sed -i '/^#/d' config.cnf # 删除所有注释行
sed -i '/^$/d' script.sh # 删除所有空行
sed -i '5,10d' file.txt # 删除第5到第10行
- 用
grep -v反向过滤,相当于在不修改原文件的情况下展示“删除后”的效果:
grep -v "^$" messy.txt # 显示时跳过空行
4. 改:文本替换与内容修改
修改最常见的形式是查找并替换,sed 是这一领域的标准工具。
sed -i 's/old-text/new-text/g' file.txt # 替换所有匹配项
sed -i '/^server/s/80/8080/' httpd.conf # 仅在以 server 开头的行替换
sed -i 's/^/PREFIX: /' data.txt # 在每行行首添加字符串
sed -i 's/, */\t/g' data.csv # 将逗号分隔符替换为制表符
对于更复杂的字段级修改,awk 可以非常自然地重新排列或计算字段:
awk -F, '{print $3, $1, $2}' data.csv # 调整列的顺序
awk -F: '$1=="user"{$3=2000}1' /etc/passwd # 修改特定用户的 UID
这里 1 是 awk 中打印当前行的简写,$1、$2 代表字段。
5. 批量编辑:处理多个文件
日常运维常常需要对一批文件进行统一修改,常见的方法是结合 find 和 sed 或使用 for 循环。
- 递归替换某目录下所有
.conf文件中的 IP 地址:
find /etc/config/ -name "*.conf" -exec sed -i 's/10\.0\.0\.1/10.0.0.2/g' {} +
- 用
for循环批量重命名文件(例如将所有.txt改为.md):
for f in *.txt; do mv "$f" "${f%.txt}.md"; done
- 对多个文件的第3行进行统一修改(例如添加注释符号):
sed -i '3s/^/## /' *.conf
- 使用
parallel工具(需要单独安装)加速大规模处理:
find . -name "*.log" | parallel gzip {}
实用要点
- 先预览,再落盘:执行
sed -i(直接修改文件)前,最好去掉-i先运行一次,确认输出无误。 - 备份与版本控制:在批量修改关键配置前,养成
cp file file.bak或用git暂存的习惯。 - 组合而非重写:不要试图用一个工具完成所有操作,把“查”交给
grep,把“替换”交给sed,把“字段重组”交给awk,用管道串联它们,这才是 Linux 文本处理哲学的精髓。
掌握上述增删改查与批量编辑方法后,你将能够以极高的效率处理服务器配置、日志分析、数据清洗等日常任务,而无需每次都打开全功能编辑器。这些命令行的组合能力,正是 Linux 系统可管理性和自动化优势的直接体现。