文本三剑客工具 核心定位 作用grep过滤与查找 在海量文本中快速定位包含特定模式sed流编辑器 以“行”为单位进行文本的增删改查无需打开文件即可实现自动化批量修改awk文本处理语言 强大的结构化文本处理工具支持分列处理、变量、条件判断和循环。grep-v反向选择Invert Match核心定义 排除法。只显示不包含指定模式的行。为什么用 运维在看配置文件如 nginx.conf 或 sshd_config时文件里往往有大量的注释行以 # 开头和空白行干扰视线。用 -v 可以瞬间过滤掉这些“噪音”。grep-v^#/etc/ssh/sshd_config-n显示行号Line Number核心定义 标记位置。在输出的每一行前面加上它在原始文件中的行号。为什么用 当你在几千行的日志或配置文件里找到了报错如果不加 -n你还得肉眼去翻第几行。知道了行号配合 vim 行号 文件名 就能一键直达现场修改。grep-nerror/var/log/nginx/error.log(输出示例152:2026/06/03 [error] … 告诉你第 152 行有错)-r递归搜索Recursive核心定义 地毯式搜索。不仅搜索当前目录还会深入到子目录、孙子目录的所有文件中去搜。为什么用 线上有几十个微服务配置和日志散落在 /etc/ 或 /var/log/ 的各个子文件夹里。你不知道具体在哪用 -r 可以直接把整个目录翻个底朝天grep-r192.168.1.100/etc/nginx/(在 nginx 目录及其所有子目录下查找哪个配置文件引用了这个 IP)-E扩展正则表达式Extended Regexp核心定义 解锁高级语法。让 grep 能够识别 ?、、{}、()、| 等高级正则符号而不需要加繁琐的反斜杠 \。为什么用 面对复杂的文本模式比如匹配 IP 地址、手机号、或者多条件“或”普通 grep 会把这些符号当成纯文本必须加 -E 才能激活它们的特殊超能力。grep-ECRITICAL|EMERGENCY/var/log/messages(同时匹配两个严重级别)最后在实际干活时运维工程师往往会把它们组合起来使用产生 112 的效果。例如grep-r-n-v^#/var/www/html/|grep-Ehttp://-r 先把 /var/www/html/ 整个项目目录及子目录全部掀开-v “^#” 瞬间把所有写了注释、不生效的行排除掉-n 紧紧贴上行号标签注意事项在生产环境使用 grep -r递归搜索时千万不要在根目录 / 或者挂载了海量网络存储如 NFS的目录上直接运行如果你在根目录运行 grep -r “keyword” /系统会去扫描 /proc内存虚拟目录、/dev设备文件甚至是几个 T 的网盘这会导致服务器 I/O 瞬间飙满CPU 100%引发线上生产事故 最佳实践 永远指定具体、狭小的目录范围如 /etc/nginx/ 或 /var/log/myapp/。sedsed 的全称是 Stream Editor流编辑器。它最强大的地方在于不需要用 vim 手动打开文件只需一行命令就能在零点几秒内把文件里成百上千处的错误内容全部改掉。sed 替换最基本的语法骨架是sed ‘s/旧内容/新内容/分境符’ 文件名 s 代表 substitute 替换。实战案例1.预览替换不修改原文件seds/listen 80;/listen 8080;/gnginx.conf默认情况下sed 只是把文件读入内存模式空间进行处理然后把结果打印到屏幕上完全不会改变硬盘上的原文件 末尾的 gglobal代表全局替换即如果一行里出现多次全部替换如果不加 g它只会替换每一行遇到的第一个。2.直接修改文件-i 参数sed-is/listen 80;/listen 8080;/gnginx.conf加上了 -iinplace参数。这时候 sed 不再把结果往屏幕上倒而是直接把修改后的内容覆盖写入到硬盘的文件中3.替换带有斜杠 / 的特殊内容sed-is#/usr/local/mysql#/data/mysql#gapp.confsed 的分隔符极其灵活s 后面紧跟的第一个字符就会被当成新的分隔符。运维常用的安全分隔符有 #、、_ 等。改用 # 之后路径里的 / 就再也不需要加反斜杠 \ 去频繁地转义了。4.只替换特定行sed-i5s/debugtrue/debugfalse/app.conf先匹配再替换只在包含 “Database” 的那一行里把 admin 改为 rootsed-i/Database/s/admin/root/gapp.conf执行建议由于 sed -i 作用强制一不小心可能把整个系统配置改废。需要在特定情况添加 -i.bak只要在 -i 后面紧跟一个扩展名中间不要有空格例如sed -i.bak ‘s/A/B/g’ config.tomlsed 会在修改 config.toml 的前一毫秒自动在当前目录下生成一个一模一样的备份文件 config.toml.bak。一旦线上报错执行 mv config.toml.bak config.toml 瞬间就能回滚复原。这在自动化部署脚本中是雷打不动的标准规范awkawk ‘{print $1,$3}’ 文件核心定义 默认切片输出。为什么用 awk 默认会把每一行文本按照空格或制表符Tab切成一列一列。$1 代表第 1 列$3 代表第 3 列中间的逗号 , 在输出时会变 成一个空格。运维实战 检查系统内存。执行 free -h 时你想直接提取“Total总量”和“Available可用量”这两列就可以用它直接切出来。awk -F’:’ ‘{print $1,$3}’ 文件核心定义 指定分隔符切片。为什么用 很多 Linux 系统配置文件的列不是用空格隔开的。-FField Separator就是用来指定自定义分隔符。运维实战 查看系统所有用户的 UID。Linux 的用户配置文件 /etc/passwd 是用冒号 : 分隔的。这条命令 awk -F’:’ ‘{print $1,$3}’ /etc/passwd 就能完美把用户名第1列和用户ID第3列拉出来。awk ‘/关键字/{print $1,$3}’ 文件核心定义 过滤切片组合先匹配再打印。为什么用 相当于把 grep 的过滤功能融入到了 awk 内部。只有这一行包含了“关键字”才会去打印它的第 1 和第 3 列。运维实战 找特定服务的 PID。在 ps -ef 输出的几百个进程里你只想看包含 nginx 的进程并打印它的主进程号就可以写 ps -ef | awk ‘/nginx/{print $2}’awk ‘NF2{print $1,$3}’ 文件核心定义 利用内置变量做精准条件判断。为什么用 NF 是 awk 的一个内置变量Number of Fields代表当前行一共有多少列。NF2 意味着“只有当这一行刚好被切成 2 列时”才执行后面的打印。运维实战 清洗脏数据。有时候日志文件不规整有的行全有的行缺斤少两。通过 NF 限制可以完美过滤掉那些格式破损的异常日志行。正则表达式^ 行首锚定 匹配以什么开头的行。例如 /^nginx/ 匹配所有以 nginx 开头的行。$ 行尾锚定 匹配以什么结尾的行。例如 /false$/ 寻找所有以 false 结尾的用户。^ $ 空行 行首紧接着行尾代表什么都没有的空白行。运维常用 grep -v ‘^$’ 来把文件里的所有空行删掉让配置更紧凑。[^]取反字符组 匹配除了括号内字符以外的任意单个字符。例如 [^0-9] 代表找一个非数字的字符。{m,n}限定次数 前面的字符最少出现mmm次最多出现nnn次。常用来精准匹配 IP 地址比如数字出现 1 到 3 次[0-9]{1,3}。
文本管理grep sed awk
文本三剑客工具 核心定位 作用grep过滤与查找 在海量文本中快速定位包含特定模式sed流编辑器 以“行”为单位进行文本的增删改查无需打开文件即可实现自动化批量修改awk文本处理语言 强大的结构化文本处理工具支持分列处理、变量、条件判断和循环。grep-v反向选择Invert Match核心定义 排除法。只显示不包含指定模式的行。为什么用 运维在看配置文件如 nginx.conf 或 sshd_config时文件里往往有大量的注释行以 # 开头和空白行干扰视线。用 -v 可以瞬间过滤掉这些“噪音”。grep-v^#/etc/ssh/sshd_config-n显示行号Line Number核心定义 标记位置。在输出的每一行前面加上它在原始文件中的行号。为什么用 当你在几千行的日志或配置文件里找到了报错如果不加 -n你还得肉眼去翻第几行。知道了行号配合 vim 行号 文件名 就能一键直达现场修改。grep-nerror/var/log/nginx/error.log(输出示例152:2026/06/03 [error] … 告诉你第 152 行有错)-r递归搜索Recursive核心定义 地毯式搜索。不仅搜索当前目录还会深入到子目录、孙子目录的所有文件中去搜。为什么用 线上有几十个微服务配置和日志散落在 /etc/ 或 /var/log/ 的各个子文件夹里。你不知道具体在哪用 -r 可以直接把整个目录翻个底朝天grep-r192.168.1.100/etc/nginx/(在 nginx 目录及其所有子目录下查找哪个配置文件引用了这个 IP)-E扩展正则表达式Extended Regexp核心定义 解锁高级语法。让 grep 能够识别 ?、、{}、()、| 等高级正则符号而不需要加繁琐的反斜杠 \。为什么用 面对复杂的文本模式比如匹配 IP 地址、手机号、或者多条件“或”普通 grep 会把这些符号当成纯文本必须加 -E 才能激活它们的特殊超能力。grep-ECRITICAL|EMERGENCY/var/log/messages(同时匹配两个严重级别)最后在实际干活时运维工程师往往会把它们组合起来使用产生 112 的效果。例如grep-r-n-v^#/var/www/html/|grep-Ehttp://-r 先把 /var/www/html/ 整个项目目录及子目录全部掀开-v “^#” 瞬间把所有写了注释、不生效的行排除掉-n 紧紧贴上行号标签注意事项在生产环境使用 grep -r递归搜索时千万不要在根目录 / 或者挂载了海量网络存储如 NFS的目录上直接运行如果你在根目录运行 grep -r “keyword” /系统会去扫描 /proc内存虚拟目录、/dev设备文件甚至是几个 T 的网盘这会导致服务器 I/O 瞬间飙满CPU 100%引发线上生产事故 最佳实践 永远指定具体、狭小的目录范围如 /etc/nginx/ 或 /var/log/myapp/。sedsed 的全称是 Stream Editor流编辑器。它最强大的地方在于不需要用 vim 手动打开文件只需一行命令就能在零点几秒内把文件里成百上千处的错误内容全部改掉。sed 替换最基本的语法骨架是sed ‘s/旧内容/新内容/分境符’ 文件名 s 代表 substitute 替换。实战案例1.预览替换不修改原文件seds/listen 80;/listen 8080;/gnginx.conf默认情况下sed 只是把文件读入内存模式空间进行处理然后把结果打印到屏幕上完全不会改变硬盘上的原文件 末尾的 gglobal代表全局替换即如果一行里出现多次全部替换如果不加 g它只会替换每一行遇到的第一个。2.直接修改文件-i 参数sed-is/listen 80;/listen 8080;/gnginx.conf加上了 -iinplace参数。这时候 sed 不再把结果往屏幕上倒而是直接把修改后的内容覆盖写入到硬盘的文件中3.替换带有斜杠 / 的特殊内容sed-is#/usr/local/mysql#/data/mysql#gapp.confsed 的分隔符极其灵活s 后面紧跟的第一个字符就会被当成新的分隔符。运维常用的安全分隔符有 #、、_ 等。改用 # 之后路径里的 / 就再也不需要加反斜杠 \ 去频繁地转义了。4.只替换特定行sed-i5s/debugtrue/debugfalse/app.conf先匹配再替换只在包含 “Database” 的那一行里把 admin 改为 rootsed-i/Database/s/admin/root/gapp.conf执行建议由于 sed -i 作用强制一不小心可能把整个系统配置改废。需要在特定情况添加 -i.bak只要在 -i 后面紧跟一个扩展名中间不要有空格例如sed -i.bak ‘s/A/B/g’ config.tomlsed 会在修改 config.toml 的前一毫秒自动在当前目录下生成一个一模一样的备份文件 config.toml.bak。一旦线上报错执行 mv config.toml.bak config.toml 瞬间就能回滚复原。这在自动化部署脚本中是雷打不动的标准规范awkawk ‘{print $1,$3}’ 文件核心定义 默认切片输出。为什么用 awk 默认会把每一行文本按照空格或制表符Tab切成一列一列。$1 代表第 1 列$3 代表第 3 列中间的逗号 , 在输出时会变 成一个空格。运维实战 检查系统内存。执行 free -h 时你想直接提取“Total总量”和“Available可用量”这两列就可以用它直接切出来。awk -F’:’ ‘{print $1,$3}’ 文件核心定义 指定分隔符切片。为什么用 很多 Linux 系统配置文件的列不是用空格隔开的。-FField Separator就是用来指定自定义分隔符。运维实战 查看系统所有用户的 UID。Linux 的用户配置文件 /etc/passwd 是用冒号 : 分隔的。这条命令 awk -F’:’ ‘{print $1,$3}’ /etc/passwd 就能完美把用户名第1列和用户ID第3列拉出来。awk ‘/关键字/{print $1,$3}’ 文件核心定义 过滤切片组合先匹配再打印。为什么用 相当于把 grep 的过滤功能融入到了 awk 内部。只有这一行包含了“关键字”才会去打印它的第 1 和第 3 列。运维实战 找特定服务的 PID。在 ps -ef 输出的几百个进程里你只想看包含 nginx 的进程并打印它的主进程号就可以写 ps -ef | awk ‘/nginx/{print $2}’awk ‘NF2{print $1,$3}’ 文件核心定义 利用内置变量做精准条件判断。为什么用 NF 是 awk 的一个内置变量Number of Fields代表当前行一共有多少列。NF2 意味着“只有当这一行刚好被切成 2 列时”才执行后面的打印。运维实战 清洗脏数据。有时候日志文件不规整有的行全有的行缺斤少两。通过 NF 限制可以完美过滤掉那些格式破损的异常日志行。正则表达式^ 行首锚定 匹配以什么开头的行。例如 /^nginx/ 匹配所有以 nginx 开头的行。$ 行尾锚定 匹配以什么结尾的行。例如 /false$/ 寻找所有以 false 结尾的用户。^ $ 空行 行首紧接着行尾代表什么都没有的空白行。运维常用 grep -v ‘^$’ 来把文件里的所有空行删掉让配置更紧凑。[^]取反字符组 匹配除了括号内字符以外的任意单个字符。例如 [^0-9] 代表找一个非数字的字符。{m,n}限定次数 前面的字符最少出现mmm次最多出现nnn次。常用来精准匹配 IP 地址比如数字出现 1 到 3 次[0-9]{1,3}。