【发布时间】:2019-07-31 00:34:48
【问题描述】:
我正在尝试匹配netstat 中的一行,其中本地端口与传递给我的脚本的某个端口匹配。但是这个正则表达式(虽然它在正则表达式测试器中匹配)似乎不起作用。
# Get lines from netstat
IFS=$'\r\n' GLOBIGNORE='*' command eval 'NetstatLines=($(netstat -anq))'
for line in "${NetstatLines[@]}"; do
# This never matches
if [[ "$line" =~ ^\s*(TCP|UDP)\s+(\d+\.\d+\.\d+\.\d+:$iPort|\[::\d*\]:$iPort)\s+ ]]; then
echo "found it!!"
fi
done
线条看起来像:
Active Connections
Proto Local Address Foreign Address State
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING
TCP 0.0.0.0:623 0.0.0.0:0 LISTENING
TCP 0.0.0.0:2179 0.0.0.0:0 LISTENING
TCP 0.0.0.0:5040 0.0.0.0:0 LISTENING
TCP 0.0.0.0:7680 0.0.0.0:0 LISTENING
所以如果$iPort 是135,它应该匹配第 4 行。
【问题讨论】:
-
Bash 使用 posix ERE,而不是 Perl 风格的那种。
-
@Shawn 我在哪里可以找到有关该语法和测试人员的信息?
-
只要搜索“posix扩展正则表达式”,你会发现很多。
-
@Shawn 我做到了,但我找不到有关如何将当前正则表达式转换为 posix 的足够信息。
-
POSIX RE 语法不支持
\d和\s快捷方式;请改用[[:digit:]]和[[:space:]]。