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

时间:2019-06-06 15:05:39

标签: bash sed grep ip extract

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

ABCD_192.192.111.123 or
ABCD_EFG_192.111.123.192

我该如何以通用方式仅从IP字符串的前半部分+ 2个最后八位组进行grep?例如:

ABCD_111.123 or
ABCD_EFG_123.192

现在我只能获得IP

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

4 个答案:

答案 0 :(得分:0)

如果您对awk表示满意,请尝试以下。

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

答案 1 :(得分:0)

所以,我不确定您的数据,但这

$ 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/\.$/\"/'

答案 2 :(得分:0)

perl -n -e 'while(/^([^0-9]+).*\.([0-9]+\.[0-9]+)/g) {print "$1$2\n"}'

答案 3 :(得分:0)

使用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"