求正确正则表达式:匹配指定格式行并排除含grep的行
解决方案:精准匹配目标行的正则表达式
直接上能满足你需求的正则表达式:
^username\s+\d+\s+(?!.*grep).*\/some\/path\/somescript\.py$
逐部分拆解说明
开头匹配逻辑:
^username\s+\d+\s+^username:强制行的起始是username,避免匹配到中间包含该词的行\s+:匹配1个或多个空格,严格符合你要求的“至少一个空格”规则\d+:匹配一串连续数字(对应你示例里的进程ID这类数值)- 末尾的
\s+:确保数字后至少有一个空格,分隔后续内容
排除含grep的行:
(?!.*grep)- 这是负向前瞻断言,作用是检查当前位置之后的所有内容里,完全不包含
grep字符串 .*会匹配任意字符(除换行符),所以不管grep出现在行中间的哪个位置,都会被这个断言直接排除
- 这是负向前瞻断言,作用是检查当前位置之后的所有内容里,完全不包含
结尾匹配逻辑:
.*\/some\/path\/somescript\.py$.*:匹配中间的任意内容(已经被前面的断言限制不能有grep)\/some\/path\/somescript\.py:转义了/和.这两个正则特殊字符,精准匹配你指定的脚本路径$:强制行的结尾就是这个路径,避免匹配到以该路径开头但后面还有额外内容的行
示例验证
对于你的
line1:username 842 93.0 0.1 180740 36016 ? Sl Jan21 747:36 /some/path/somescript.py
完全符合所有规则,会被成功匹配对于你的
line2:username 8227 0.0 0.0 14356 2496 pts/5 S+ 11:33 0:00 grep /some/path/somescript.py
因为包含grep,会被负向前瞻断言排除,不会匹配
额外使用提示
如果是在Linux的grep命令里使用这个正则,需要加上-P参数来支持Perl兼容的正则表达式(负向前瞻属于PCRE特性),比如:
grep -P '^username\s+\d+\s+(?!.*grep).*\/some\/path\/somescript\.py$' your-log-file.txt
内容的提问来源于stack exchange,提问作者Paullo
相关产品推荐
相关产品推荐

