如何从 Bash 中的字符串中提取部分 IP 地址

How to extract part of IP address from string in Bash

我尝试从不同字符串的 IP 地址中获取最后 2 个八位字节。 其中一些语法如下:

ABCD_192.192.111.123 or
ABCD_EFG_192.111.123.192

我如何以通用方式 grep 只有字符串的第一部分 + 来自 IP 的最后 2 个八位字节?例如:

ABCD_111.123 or
ABCD_EFG_123.192

现在只能获取IP

此外,我需要避免使用临时文件。

如果您觉得awk没问题,请您尝试关注一下。

awk '{sub(/[0-9]+\.[0-9]+\./,"")} 1'  Input_file

所以,我不确定你的数据,但是这个

$ echo '*"ABCD_192.192.111.123"
*"ABCD_EFG_192.111.123.192"' \|
grep -o '\*\"\([A-Z]*_\)*\([0-9]*.\)\{2\}'

生成此输出,现在如果需要,您可以通过管道传输到 sed 以用 ".

替换最后一个点
*"ABCD_192.192.
*"ABCD_EFG_192.111.

sed 's/\.$/\"/'.

所以你可以试试:

grep -o '\*\"\([A-Z]*_\)*\([0-9]*.\)\{2\}' | sed 's/\.$/\"/'
perl -n -e 'while(/^([^0-9]+).*\.([0-9]+\.[0-9]+)/g) {print "\n"}'

使用Bash拆分字符串:

string="ABCD_192.192.111.123"
IFS=_. read -r prefix octet1 octet2 octet3 octet4 <<< "$string"
printf '%s_%s.%s\n' "$prefix" "$octet3" "$octet4"

改用这个两步版本。它可以处理带有一个或多个下划线的前缀:

string="ABCD_EFG_192.192.111.123"
IFS=. read -r prefix_octet1 octet2 octet3 octet4 <<< "$string"
prefix=${prefix_octet1%_*}
printf '%s_%s.%s\n' "$prefix" "$octet3" "$octet4"