使用字符串中的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
答案 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.]+"