如何解决在包含特定单词的每一行之前打印找到的最后一个IP?
在将一行与“ abc”一词匹配之前,我想提取所有最后的IP。
我的文件:
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
,
使用gnu awk
作为记录分隔符的备用abc
:
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替换它并打印。
谢谢您的回答。
最后,我在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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。