如何从一组字符串中选择和打印 IP 地址?

Ana*_*Das 3 command-line scripts sed

我有一个句子,其中包含一个 IP 地址。例如,

This sentence contains an ip number 1.2.3.4 and port number 50, i want to print the IP address only.
Run Code Online (Sandbox Code Playgroud)

从上面的句子来看,我只想打印 IP 地址。我怎样才能做到这一点?我听说可以用sed

cho*_*oba 7

这是可能的,但不优雅:

echo 'This sentence contains an ip number 1.2.3.4 and port number 50, i want to print the IP address only.' \
| sed 's/.*\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/'
Run Code Online (Sandbox Code Playgroud)

[0-9]匹配任何数字,\{1,3\}意味着它可以重复 1 到 3 次。\.匹配一个点。整个 IP 由\(...\)括号捕获,前后匹配的内容.*,即任何重复零次或多次的内容。然后整个匹配字符串(即整行)被第一个匹配组的内容替换。

您可以通过引入变量使其更具可读性:

n='[0-9]\{1,3\}'
... | sed "s/.*\($n\.$n\.$n\.$n\).*/\1/"
Run Code Online (Sandbox Code Playgroud)

如果未找到 IP,它将打印整个字符串。它也不检查像 256.512.999.666 这样的无效 IP。


cha*_*aos 6

这是一个grep解决方案:

echo "$sentence" | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+'
Run Code Online (Sandbox Code Playgroud)
  • -o 只打印匹配的部分
  • -E 切换到扩展正则表达式
  • 该模式将每个数字 ( [0-9])匹配一次或多次 ( +),然后匹配一个点 ( \.) 并再次匹配数字...

这是另一个解决方案perl

echo "$sentence" | perl -l -ne '/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/ && print $&'
Run Code Online (Sandbox Code Playgroud)
  • -l 指定行终止符(换行符)
  • -n通过由echo(可以是多行)给出的输入循环
  • -e 代码如下
  • perl 代码中的正则表达式与上述grep解决方案中的非常相似