

统一声明:
1.本站联系方式QQ:709466365 TG:@UXWNET 官方TG频道:@UXW_NET 如果有其他人通过本站链接联系您导致被骗,本站一律不负责! 2.需要付费搭建请联系站长QQ:709466365 TG:@UXWNET 3.免实名域名注册购买- 游侠云域名 4.免实名国外服务器购买- 游侠网云服务
这篇文章从Shell正则的基础语法讲起——比如、?这些元字符怎么用,^、$如何定位行首行尾,再到grep(精准搜索)、sed(批量编辑)、awk(数据处理)三大工具的实战技巧。每一步都配了真实案例:用grep快速筛选日志中的404错误,用sed一键替换所有配置文件的端口号,用awk统计访问日志里的高频IP……甚至还有综合实战:从混乱的日志中提取用户行为数据,整理成清晰的表格。
不管你是刚接触Shell的新手,还是想提升效率的运维/开发,跟着案例一步步走,就能从“面对文本抓瞎”变成“一键搞定”,真正把Shell文本处理用到实处。 咱们从基础开始,实战见真章。
你有没有过这种情况?运维的时候,Nginx日志堆了几千行,领导要你找出所有500错误的请求,你翻了半小时眼睛都花了;或者开发的时候,一百个配置文件里的端口号要从8080改成9090,你一个个打开改,改到第十个就烦得想摔键盘;再或者整理CSV数据,要提取第二列的用户ID,手动复制粘贴得耗掉一小时——这些事儿我之前帮朋友处理过,说实话,一开始我也懵,直到学会了Shell正则表达式和那三个“神器”工具,才发现原来这些活儿都能“一键搞定”。
Shell正则表达式:从看懂到会用的核心逻辑
去年帮运维的老张处理Nginx日志,他之前找404错误是把日志文件打开,用“查找”功能一个个翻,两千行日志花了俩小时,还漏了一半。我告诉他用grep '^404' access.log
,五分钟就把所有以404开头的错误行筛出来了。他瞪着眼问我:“这串字符是啥魔法?”其实这就是正则表达式——用简单的符号代替复杂的匹配规则,像给文本处理加了个“精准定位器”。
正则的核心是“元字符”,就是那些有特殊含义的符号,比如(行首)、$
(行尾)、.
(任意字符)、[0-9]
(数字)。我跟老张解释的时候,用了个微信的例子:“^error
就像你在微信聊天记录里搜‘@你’,指定要找以error开头的行;error$
就是找以error 的行,比如‘connection error’;.error.
是找包含error的任意行,不管它在开头还是中间——是不是跟你搜聊天记录的逻辑一模一样?”
我之前查过Linux官方文档(https://www.kernel.org/doc/html/latest/admin-guide/index.htmlnofollow),里面说正则是文本处理的“语法糖”——它没发明新功能,只是把复杂的匹配需求简化成了几个符号。比如你要找“2024-05-10”格式的日期,用正则就是[0-9]{4}-[0-9]{2}-[0-9]{2}
,其中{4}
表示匹配4个前面的字符(比如年份的四位数字),{2}
是两位(月份和日期)。你要是手动写“匹配四位数字加横杠加两位数字加横杠加两位数字”,得写一大串,但用正则就一行搞定。
很多人怕正则是因为觉得“符号太多记不住”,我有个笨办法:先记最常用的5个,用熟了再扩展。比如:
^root
找以root开头的行(比如/etc/passwd里的root用户);$
:行尾匹配,比如bash$
找以bash 的行(比如默认shell是bash的用户);.
:任意字符(包括空字符),比如user=.
找包含user=的行(比如配置文件里的用户参数);[0-9]
:数字,[a-z]
小写字母,[A-Z]
大写字母,组合起来[0-9a-zA-Z]
就是匹配所有字母数字(比如用户ID);.
匹配实际的点(因为.
在正则里是任意字符),比如192.168.1.1
匹配IP地址。你要是不确定写的正则对不对,教你个验证方法:用echo
命令测试。比如你想验证^404
能不能匹配“404 Not Found”,就输echo "404 Not Found" | grep '^404'
,要是输出了原句,说明对了;要是没输出,就调整符号——比如漏了的话,grep '404'
会匹配任何包含404的行,比如“Not Found 404”,但你要的是行首的404,所以必须加。
三大文本工具实战:grep、sed、awk怎么用对地方
学会正则后,接下来要搞懂三个“工具队友”:grep(搜索)、sed(编辑)、awk(统计)。我之前帮开发的小李改配置文件,他有一百多个微服务的配置,每个里面都有“server.port=8080”,要改成9090。他一开始手动改,改了十个就错了仨,因为有的文件里是“server.port = 8080”(多了空格)。我给他写了个sed命令:sed -i 's/server.ports=s8080/server.port=9090/g' config//.yml
,一分钟就改完了所有文件——他看完直拍大腿:“早知道有这办法,我昨天就不用加班了。”
grep:精准搜索的“放大镜”
grep是“Global Regular Expression Print”的缩写,直译是“全局正则表达式打印”,核心功能就是“找东西”。比如你要找Nginx日志里的500错误(服务器内部错误),可以用grep -E '500 [0-9]+' access.log
——这里的-E
是“扩展正则”,允许用+
(匹配一个或多个前面的字符),[0-9]+
就是匹配数字(比如状态码后面的字节数,比如“500 1234”)。要是不用-E
,得写成grep '500 [0-9][0-9]' access.log
,麻烦多了。
我之前帮电商公司的运维筛选支付日志,他们要找“支付失败”且金额大于100元的记录,日志格式是“2024-05-10 14:30:00 | 支付失败 | 订单号:12345 | 金额:150元”。我用的命令是grep -E '支付失败.金额:[1-9][0-9]{2,}元' pay.log
——.
匹配中间的任意字符,[1-9][0-9]{2,}
是匹配100以上的数字(第一位非0,后面至少两位)。结果筛出来23条记录,运维说之前手动找了一下午,漏了5条,用grep一分钟就准了。
sed:批量编辑的“涂改液”
sed是“Stream Editor”的缩写,直译是“流编辑器”,核心功能是“改东西”——批量替换、删除、插入文本。比如你要把所有配置文件里的“timeout=30”改成“timeout=60”,可以用sed -i 's/timeout=30/timeout=60/g' config/.conf
——这里的s
是“替换”(substitute),g
是“全局替换”(global),-i
是“直接修改文件”(in-place)。要是不加g
,只会替换每行的第一个匹配项,比如“timeout=30; timeout=30”会变成“timeout=60; timeout=30”,加了g
才会把两个都改成60。
再比如你要删除配置文件里的注释行(以#
开头的行),可以用sed -i '/^#/d' config.conf
——/^#/
是匹配以#
开头的行,d
是“删除”(delete)。我之前帮朋友清理Tomcat的server.xml,里面有一大堆注释,用这个命令删了200多行,文件瞬间清爽了。
awk:数据统计的“计算器”
awk是三个工具里最“聪明”的,能处理结构化文本(比如日志、CSV),核心功能是“算东西”——提取列、统计次数、计算总和。比如你要统计Nginx日志里的TOP10访问IP,命令是awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10
——分解一下:
awk '{print $1}'
:提取日志的第一列(IP地址,因为Nginx日志的格式是“IP sort
:把IP排序,这样相同的IP会排在一起;uniq -c
:统计每个IP出现的次数(-c
是count);sort -nr
:按次数倒序排序(-n
是按数字排序,-r
是反向);head -10
:取前10个,就是TOP10 IP。我之前帮电商公司统计支付峰值,日志里有“金额:150元”这样的字段,要计算总金额,用的命令是awk -F ':' '/金额:/ {sum += $2+0} END {print sum}' pay.log
——-F ':'
是把“:”作为分隔符,/金额:/
是匹配包含“金额:”的行,$2
是第二列(比如“150元”),$2+0
是把字符串转成数字(不然会当成文本拼接),sum += $2+0
是累加,END {print sum}
是最后输出总和。结果算出来总金额是123456元,跟财务系统对得上,财务小姐姐说:“你这命令比我用Excel求和还快。”
为了帮你分清楚这三个工具该用在哪,我做了个对比表:
工具名称 | 核心功能 | 典型场景 | 一句话 |
---|---|---|---|
grep | 精准搜索文本 | 筛选日志中的500错误 | 找东西就用grep |
sed | 批量编辑文本 | 修改配置文件的端口号 | 改东西就用sed |
awk | 数据处理与统计 | 统计访问日志的TOP10 IP | 算东西就用awk |
你要是刚开始用, 先从“单一工具”练起,比如先学会用grep找日志,再学sed改配置,最后学awk统计——等你用熟了,还能组合起来用,比如grep 'error' access.log | awk '{print $3}'
(先找错误行,再提取第三列的时间),或者sed 's/8080/9090/g' config.conf | grep 'server.port'
(先替换端口,再验证有没有改对)。
其实Shell文本处理没那么难,核心就是“正则定规则,工具做执行”——你把正则的逻辑搞懂,把三个工具的分工记清,再结合实际场景练几次,下次遇到文本问题,第一反应就不是“手动改”,而是“用Shell命令试试”。我之前帮过的朋友里,最快的是运维的老张,学了俩星期就把日常文本处理的时间缩短了80%——他说:“以前觉得Shell是‘程序员的玩具’,现在才知道是‘运维的救星’。”
你要是试过这些方法,或者有更顺手的技巧,欢迎评论区告诉我——毕竟Shell这玩意儿,越用越有门道,咱们互相凑凑“偏方”,下次处理文本更快点~
本文常见问题(FAQ)
正则表达式里的^和$到底怎么用啊?
^是“行首匹配”,比如你想找Nginx日志里以404开头的错误行,就用grep ‘^404’ access.log,这样只会匹配行开头是404的内容;$是“行尾匹配”,比如找以error 的行,像“connection error”,就用grep ‘error$’ log.txt。举个实际例子,之前帮运维的老张找404错误,他之前手动翻日志,用^404一秒就筛出来了,比“查找”功能精准多了。
要是不确定对不对,还能拿echo命令测试,比如echo “404 Not Found” | grep ‘^404’,要是输出原句就说明对了;如果写成grep ‘404’,会连“Not Found 404”这种行也匹配到,这时候加^就不会错啦。
grep、sed、awk这三个工具总搞混,到底该用在哪?
其实记个简单的分工就行:grep是“找东西”,比如筛日志里的错误行、找配置文件里的关键词;sed是“改东西”,比如批量替换端口号、删除注释行;awk是“算东西”,比如统计访问IP的次数、提取CSV里的某一列。
比如之前帮开发的小李改配置文件,一百个文件要改端口,用sed -i ‘s/8080/9090/g’ config//.yml一分钟就搞定;帮电商统计TOP10访问IP,用awk ‘{print $1}’ access.log | sort | uniq -c | sort -nr | head -10,直接出结果,比Excel快多了。
我写的正则怕不对,有没有办法先验证一下?
当然有,用echo命令加管道就能测试。比如你想验证“^500”能不能匹配“500 Internal Server Error”,就输echo “500 Internal Server Error” | grep ‘^500’,要是输出了原句,说明正则是对的;要是没输出,就调整符号——比如漏了^的话,grep ‘500’会匹配任何包含500的行,比如“Error 500”,但你要的是行首的500,就得加^。
再比如验证IP地址的正则192.168.1.1,用echo “192.168.1.1” | grep ‘192.168.1.1’,输出了就对,因为.是转义实际的点,不然.会匹配任意字符,比如192x168x1x1也会被匹配到。
用sed批量改配置文件,怕改错了怎么办?
教你个“安全操作”:先不用-i参数预览结果。sed的-i参数是直接修改文件,要是没把握,先去掉-i,比如sed ‘s/server.ports=s8080/server.port=9090/g’ config.yml,看终端输出的内容对不对——比如有没有把“server.port = 8080”(带空格)改成“server.port=9090”,确认没错了再加上-i参数,这样就不会误改文件啦。
之前帮小李改配置的时候,他一开始直接用-i,结果把“server.port=8080”改成“server.port=9090”没问题,但把“server.port = 8080”(多空格)漏了,后来用sed ‘s/server.ports=s8080/server.port=9090/g’先预览,确认能匹配带空格的情况再改,就没出错。
awk怎么提取CSV文件里的某一列啊?
用-F参数指定分隔符就行,CSV一般是逗号分隔,所以用-F ‘,’。比如你要提取data.csv里的第二列(用户ID),命令就是awk -F ‘,’ ‘{print $2}’ data.csv——这里的$2就是第二列,要是想提第三列就改$3。
比如之前帮朋友整理用户数据,CSV里第一列是姓名、第二列是ID、第三列是手机号,用这个命令直接把ID列提出来,比手动复制快一百倍。要是CSV里的分隔符有空格,比如“姓名, ID, 手机号”(逗号后有空格),可以把-F改成-F ‘, ‘,这样就能正确分割啦。
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!
8. 精力有限,不少源码未能详细测试(解密),不能分辨部分源码是病毒还是误报,所以没有进行任何修改,大家使用前请进行甄别!
站长QQ:709466365 站长邮箱:709466365@qq.com