文章目录

Shell 脚本文件操作:cat、grep、sed

发布于 2026-04-06 12:50:08 · 浏览 17 次 · 评论 0 条

Shell 脚本文件操作:cat、grep、sed

Shell 脚本处理文本文件的核心逻辑可以概括为“查、找、改”。cat 负责查看与合并,grep 负责搜索与过滤,sed 负责编辑与替换。掌握这三个命令的组合使用,能解决绝大多数日志分析与配置文件修改场景。


一、使用 cat 查看与合并文件

cat (concatenate) 最基础的功能是将文件内容输出到屏幕,但通过参数组合,它能完成更高效的预处理工作。

  1. 查看 单个文件内容。
    打开 终端,输入 cat filename.txt。这会将文件所有内容一次性滚动显示在屏幕上。若文件过长,建议搭配 moreless 命令,例如 cat filename.txt | less

  2. 显示 行号。
    在排查日志或代码错误时,行号至关重要。输入 cat -n filename.txt
    系统会在每一行前面加上行号,空行也会被编号。若想忽略空行编号,使用 cat -b filename.txt

  3. 合并 多个文件。
    若需将多个配置文件合并为一个,执行 cat file1.txt file2.txt > combined.txt
    这里的 > 是重定向符号,会将 file1.txtfile2.txt 的内容按顺序拼接,并写入 combined.txt。若 combined.txt 已存在,原内容会被覆盖。

  4. 追加 内容到现有文件。
    若要在文件末尾追加内容而不是覆盖,使用 >> 符号。
    输入 cat file3.txt >> combined.txt。这会将 file3.txt 的内容追加到 combined.txt 的末尾。


二、使用 grep 搜索与过滤文本

grep 是强大的文本搜索工具,支持正则表达式,非常适合从海量日志中提取关键信息。

  1. 搜索 包含特定字符串的行。
    输入 grep "error" logfile.txt
    系统会列出 logfile.txt 中所有包含 "error" 的行。搜索内容建议用双引号包裹,以支持包含空格的搜索词。

  2. 忽略大小写 进行搜索。
    当不确定错误信息的大小写格式(如 Error, ERROR, error)时,添加 -i 参数。
    执行 grep -i "error" logfile.txt

  3. 显示 行号与上下文。
    为了定位错误位置,需要显示行号。使用 grep -n "error" logfile.txt
    若还需要查看错误前后几行的代码逻辑,添加 -C (Context) 参数。
    输入 grep -C 5 "error" logfile.txt。这会显示匹配行及其上下各 5 行的内容。

  4. 反向过滤 排除特定内容。
    若想查看日志中不包含 "debug" 的所有行,使用 -v 参数。
    执行 grep -v "debug" logfile.txt。这在过滤掉冗余调试信息时非常有效。

  5. 递归搜索 目录下所有文件。
    当不确定目标字符串位于哪个文件时,添加 -r 参数。
    输入 grep -r "function_name" /path/to/dir/。这会搜索指定目录及其子目录下的所有文件。


三、使用 sed 编辑与替换文本

sed (stream editor) 是非交互式的流编辑器,常用于自动化替换文件中的文本。其核心语法格式为 sed 's/旧文本/新文本/操作' 文件名

  1. 替换 每行首个匹配项。
    输入 sed 's/old/new/' filename.txt
    这会将每行中的第一个 "old" 替换为 "new",并输出结果到屏幕。注意,默认情况下文件本身不会被修改,仅输出结果。

  2. 全局替换 所有匹配项。
    默认替换仅针对每行的第一个匹配。若需替换一行中的所有匹配项,添加 全局标志 g
    执行 sed 's/old/new/g' filename.txt

  3. 删除 特定行。
    若需删除文件中的空行或注释行,使用 d 命令。
    输入 sed '/^$/d' filename.txt` 删除所有空行(`^$ 表示空行)。
    输入 sed '3d' filename.txt 删除第 3 行。

  4. 直接修改 文件内容。
    上述操作仅将结果输出到屏幕。若要直接修改源文件,添加 -i 参数。
    执行 sed -i 's/old/new/g' filename.txt
    此操作不可逆,建议在操作重要文件前先备份,或使用 sed -i.bak 's/old/new/g' filename.txt,这会自动生成 .bak 后缀的备份文件。


四、实战组合案例

单个命令的能力有限,通过管道符 | 组合使用,能实现复杂的文本处理流程。

案例:从日志中提取特定错误并统计

假设有一个日志文件 app.log,需要提取所有包含 "Exception" 的行,去掉行首的时间戳,并将 "Exception" 替换为 "错误",最后保存到新文件。

  1. 提取 关键行。
    输入 cat app.log | grep "Exception"
    这步筛选出所有包含异常的行。

  2. 去除 行首时间戳。
    假设时间戳格式为 [2023-10-01]追加 sed 命令。
    输入 cat app.log | grep "Exception" | sed 's/^\[.*\] //'
    ^\[.*\] // 表示匹配以 [ 开头、中间任意字符、以 ] 加空格结尾的部分,并替换为空。

  3. 替换 关键词并保存。
    完成 最后的替换与输出重定向。
    执行 以下命令:

    cat app.log | grep "Exception" | sed 's/^\[.*\] //' | sed 's/Exception/错误/g' > error_report.txt

流程逻辑示意

以下图表展示了上述组合命令的数据流转过程:

graph LR A["原始文件 app.log"] --> B["cat: 读取全部内容"] B --> C["grep: 过滤 Exception"] C --> D["sed: 去除时间戳"] D --> E["sed: 替换关键词"] E --> F["结果文件 error_report.txt"]

常用参数速查表

为了方便记忆,以下是三个命令的高频参数总结。

命令 参数 功能说明
cat -n 显示行号(包括空行)
cat -b 显示行号(忽略空行)
grep -i 忽略大小写
grep -v 反向选择(排除匹配行)
grep -r 递归搜索子目录
sed s/old/new/ 替换每行第一个匹配
sed s/old/new/g 全局替换所有匹配
sed -i 直接修改源文件

通过灵活组合这些指令,可以快速完成文件的查看、筛选与批量修改任务。

评论 (0)

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

扫一扫,手机查看

扫描上方二维码,在手机上查看本文