Shell 脚本文件操作:cat、grep、sed
Shell 脚本处理文本文件的核心逻辑可以概括为“查、找、改”。cat 负责查看与合并,grep 负责搜索与过滤,sed 负责编辑与替换。掌握这三个命令的组合使用,能解决绝大多数日志分析与配置文件修改场景。
一、使用 cat 查看与合并文件
cat (concatenate) 最基础的功能是将文件内容输出到屏幕,但通过参数组合,它能完成更高效的预处理工作。
-
查看 单个文件内容。
打开 终端,输入cat filename.txt。这会将文件所有内容一次性滚动显示在屏幕上。若文件过长,建议搭配more或less命令,例如cat filename.txt | less。 -
显示 行号。
在排查日志或代码错误时,行号至关重要。输入cat -n filename.txt。
系统会在每一行前面加上行号,空行也会被编号。若想忽略空行编号,使用cat -b filename.txt。 -
合并 多个文件。
若需将多个配置文件合并为一个,执行cat file1.txt file2.txt > combined.txt。
这里的>是重定向符号,会将file1.txt和file2.txt的内容按顺序拼接,并写入combined.txt。若combined.txt已存在,原内容会被覆盖。 -
追加 内容到现有文件。
若要在文件末尾追加内容而不是覆盖,使用>>符号。
输入cat file3.txt >> combined.txt。这会将file3.txt的内容追加到combined.txt的末尾。
二、使用 grep 搜索与过滤文本
grep 是强大的文本搜索工具,支持正则表达式,非常适合从海量日志中提取关键信息。
-
搜索 包含特定字符串的行。
输入grep "error" logfile.txt。
系统会列出logfile.txt中所有包含 "error" 的行。搜索内容建议用双引号包裹,以支持包含空格的搜索词。 -
忽略大小写 进行搜索。
当不确定错误信息的大小写格式(如 Error, ERROR, error)时,添加-i参数。
执行grep -i "error" logfile.txt。 -
显示 行号与上下文。
为了定位错误位置,需要显示行号。使用grep -n "error" logfile.txt。
若还需要查看错误前后几行的代码逻辑,添加-C(Context) 参数。
输入grep -C 5 "error" logfile.txt。这会显示匹配行及其上下各 5 行的内容。 -
反向过滤 排除特定内容。
若想查看日志中不包含 "debug" 的所有行,使用-v参数。
执行grep -v "debug" logfile.txt。这在过滤掉冗余调试信息时非常有效。 -
递归搜索 目录下所有文件。
当不确定目标字符串位于哪个文件时,添加-r参数。
输入grep -r "function_name" /path/to/dir/。这会搜索指定目录及其子目录下的所有文件。
三、使用 sed 编辑与替换文本
sed (stream editor) 是非交互式的流编辑器,常用于自动化替换文件中的文本。其核心语法格式为 sed 's/旧文本/新文本/操作' 文件名。
-
替换 每行首个匹配项。
输入sed 's/old/new/' filename.txt。
这会将每行中的第一个 "old" 替换为 "new",并输出结果到屏幕。注意,默认情况下文件本身不会被修改,仅输出结果。 -
全局替换 所有匹配项。
默认替换仅针对每行的第一个匹配。若需替换一行中的所有匹配项,添加 全局标志g。
执行sed 's/old/new/g' filename.txt。 -
删除 特定行。
若需删除文件中的空行或注释行,使用d命令。
输入sed '/^$/d' filename.txt` 删除所有空行(`^$表示空行)。
输入sed '3d' filename.txt删除第 3 行。 -
直接修改 文件内容。
上述操作仅将结果输出到屏幕。若要直接修改源文件,添加-i参数。
执行sed -i 's/old/new/g' filename.txt。
此操作不可逆,建议在操作重要文件前先备份,或使用sed -i.bak 's/old/new/g' filename.txt,这会自动生成.bak后缀的备份文件。
四、实战组合案例
单个命令的能力有限,通过管道符 | 组合使用,能实现复杂的文本处理流程。
案例:从日志中提取特定错误并统计
假设有一个日志文件 app.log,需要提取所有包含 "Exception" 的行,去掉行首的时间戳,并将 "Exception" 替换为 "错误",最后保存到新文件。
-
提取 关键行。
输入cat app.log | grep "Exception"。
这步筛选出所有包含异常的行。 -
去除 行首时间戳。
假设时间戳格式为[2023-10-01],追加sed命令。
输入cat app.log | grep "Exception" | sed 's/^\[.*\] //'。
^\[.*\] //表示匹配以[开头、中间任意字符、以]加空格结尾的部分,并替换为空。 -
替换 关键词并保存。
完成 最后的替换与输出重定向。
执行 以下命令:cat app.log | grep "Exception" | sed 's/^\[.*\] //' | sed 's/Exception/错误/g' > error_report.txt
流程逻辑示意
以下图表展示了上述组合命令的数据流转过程:
常用参数速查表
为了方便记忆,以下是三个命令的高频参数总结。
| 命令 | 参数 | 功能说明 |
|---|---|---|
cat |
-n |
显示行号(包括空行) |
cat |
-b |
显示行号(忽略空行) |
grep |
-i |
忽略大小写 |
grep |
-v |
反向选择(排除匹配行) |
grep |
-r |
递归搜索子目录 |
sed |
s/old/new/ |
替换每行第一个匹配 |
sed |
s/old/new/g |
全局替换所有匹配 |
sed |
-i |
直接修改源文件 |
通过灵活组合这些指令,可以快速完成文件的查看、筛选与批量修改任务。

暂无评论,快来抢沙发吧!