打印在每行包含特定单词之前找到的最后一个IP



在将一行与单词"匹配之前,我想提取所有最后的IP;abc";。

我的文件:

IP address: 10.1.1.1
IP address: 192.168.1.1        
some text
some text abc
more lines of text
IP address: 10.1.1.1
some text
IP address: 127.0.0.1
some text abc

预期结果:

192.168.1.1
127.0.0.1

我尝试过的:

我在特定文件中搜索了包含abc的行,并显示了之前的50行,然后我查找了具有IP地址的行,最后提取了结果的IP号。

grep -Ri "*file*.txt" "abc" . -B 50 | grep "IP address: " | cut -d " " -f 3 > IP_list.txt

然而,文本的大小可能在文件之间发生变化,有时一个文件可能包含多行abc,因此结果不可靠。

我想要一个更多的";"干净";方法谢谢

$ awk '/^IP/{ip=$NF} /abc/{print ip}' file
192.168.1.1
127.0.0.1

使用abc作为记录分隔符的替代gnu awk

awk -v RS='abc' '/IP address:/ {
print gensub(/.* (([0-9]+.){3}[0-9]+).*/, "\1", 1)}' file
192.168.1.1
127.0.0.1

这可能对你有用(GNU sed(:

sed -n '/^IP/h;/abc/{g;s/.*: //p}' file

如果一行以IP开头,则将其存储在保留空间中。

如果一行包含abc,请将其替换为存储的IP并打印。

感谢您的回答。

最后,我用一个";OR";在我的grep命令中,从上到下列出所有IP和abc单词。然后,我将结果传递给另一个grep,以显示abc单词上方的第一个IP。最后,我只输出其余的IP地址。

grep 'IP address:|abc' myfile | grep abc -B1 | grep -oE "b([0-9]{1,3}.){3}[0-9]{1,3}b" > all_ip_linked_to_abc

最新更新