如何使用grep配合正则表达式匹配netstat输出中的进程PID
问题原因
- 正则引擎兼容问题:grep默认使用基础正则表达式(BRE)模式,老版本GNU grep在BRE模式下不支持
\S元字符,会将其解析为字面量字符S,此时\S*$实际匹配的是行尾连续的S字符,自然无法得到目标结果。在线正则测试工具默认使用PCRE引擎,原生支持\S匹配非空白字符的语法,因此测试时可以正常匹配。 - 输出隐藏字符干扰:netstat输出重定向到管道时,部分场景下会在行尾携带不可见的回车符
\r(属于空白字符)、列对齐填充的尾部空格,会干扰行尾锚定的匹配逻辑。
正确实现方案
按兼容性从高到低排序:
用awk直接取最后一列,完全规避正则兼容和隐藏字符问题,是最稳定的方案:
# 输出 6202/java 格式 sudo netstat -tulpn | grep java | awk '{print $NF}' # 仅输出纯数字PID 6202 格式 sudo netstat -tulpn | grep java | awk '{print $NF}' | cut -d'/' -f1awk会自动将任意数量的空格、制表符、控制符识别为列分隔符,
$NF固定代表分割后的最后一列,不需要额外处理行尾特殊字符。使用POSIX标准字符集编写兼容所有grep版本的正则,不需要额外开启引擎参数:
sudo netstat -tulpn | grep java | grep -o '[^[:space:]]*$'[^[:space:]]是POSIX标准中定义的非空白字符匹配规则,所有版本grep均支持,效果和\S完全一致。给grep加
-P参数启用PCRE引擎,兼容\S语法,同时过滤尾部可能存在的空白字符:sudo netstat -tulpn | grep java | grep -oP '\S+(?=\s*$)'
内容的提问来源于stack exchange,提问作者user7858768
相关产品推荐
相关产品推荐

