使用sed和awk从字符串中提取所有ip地址

时间:2018-02-04 04:29:44

标签: bash awk sed

使用字符串中的grep提取所有ip地址很简单。

string="221.11.165.237xxxx221.11.165.233\n
219.158.9.97ttttt219.158.19.137"
echo $string |grep -oP "(\d+\.){3}\d+"
221.11.165.237
221.11.165.233
219.158.9.97
219.158.19.137

regrex模式很简单(\d+\.){3}\d+ 用sed和awk做同样的工作 对于sed:

echo $string | sed 's/^\(\(\d\+\.\)\{3\}\d\+\)$/\1/g'
221.11.165.237xxxx221.11.165.233\n 219.158.9.97ttttt219.158.19.137

对于awk:

echo $string |gawk 'match($0,/(\d+\.){3}\d+/,k){print k}'
echo $string |awk '/(\d+\.){3}\d+/{print}'

如何为sed和gawk(awk)修复它?
期望输出与grep相同。

221.11.165.237
221.11.165.233
219.158.9.97
219.158.19.137

3 个答案:

答案 0 :(得分:2)

很少有工具会将\d识别为digits。只需使用[0-9][[:digit:]]代替:

$ echo "$string" | awk -v RS='([0-9]+\\.){3}[0-9]+' 'RT{print RT}'
221.11.165.237
221.11.165.233
219.158.9.97
219.158.19.137

以上使用GNU awk进行多字符RS和RT。有任何awk:

$ echo "$string" | awk '{while ( match($0,/([0-9]+\.){3}[0-9]+/) ) { print substr($0,RSTART,RLENGTH); $0=substr($0,RSTART+RLENGTH) } }'
221.11.165.237
221.11.165.233
219.158.9.97
219.158.19.137

答案 1 :(得分:1)

这可能适合你(GNU sed):

sed '/\n/!s/[0-9.]\+/\n&\n/;/^\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\n/P;D' file

在仅由数字和句点组成的字符串的任一侧插入换行符。如果一行只包含一个IP地址,则打印出来。

更容易上手的演绎使用-r选项:

sed -r '/\n/!s/[0-9.]+/\n&\n/;/^([0-9]{1,3}\.){3}[0-9]{1,3}\n/P;D' <<<"$string"

答案 2 :(得分:0)

由于你没有具体说明ip地址之间可能存在什么,我接受了这样一个事实,即ip中只有数字和句号:

echo "$string" | sed -r 's/[^0-9.]+/\n/'

echo "$string" | awk '1' RS="[^0-9.]+"