您提到sed 解决方案是最受欢迎的,但我相信awk 将最容易用于您的特定任务。这是我的解决方案:
awk '/^[[:digit:]]\.[[:digit:]]\.[[:digit:]]\.[[:digit:]]/ { printf $1; gsub (/http\:\/\//," "); gsub(/\.com/," ");printf " "$4"\n" }' inputFile.txt
这个想法很简单:默认情况下awk 的字段分隔符是空格并允许打印特定字段,因此首先我们匹配以 ip 地址开头的行(四个数字点交替模式);我们打印第一个字段,然后去掉https 和.com 部分,只剩下域名,因此变成了第4个字段,我们接下来打印。其余部分未指定打印,因此被忽略。
如果您想要编辑原始文件,awk 有一个怪癖,即它无法进行内联编辑,除非那是 gawk (GNU awk),因此为此目的使用临时文件。
演示:
我的输入文件
xieerqi:$ cat inputFile.txt
bigspeedpro.com Intel::DOMAIN from http://malc0de.com/bl/BOOT via intel.criticalstack.com F
1.1.1.1 Intel::DOMAIN from http://abcd.com/bl/BOOT via intel.criticalstack.com F
whatever.com Intel::DOMAIN from http://malc0de.com/bl/BOOT via intel.criticalstack.com F
2.2.2.2 Intel::DOMAIN from http://asdf.com/bl/BOOT via intel.criticalstack.com F
带有临时文件传输的命令(注意我的 inputFile.txt 在我的主目录中,相应地调整该部分)。注意:始终始终备份原始文件以防万一!或者在&&之前运行命令的第一部分,检查临时文件,如果你喜欢,将文件cat到原始文件中。
awk '/^[[:digit:]]\.[[:digit:]]\.[[:digit:]]\.[[:digit:]]/ { printf $1; gsub (/http\:\/\//," "); gsub(/\.com/," ");printf " "$4"\n" }' inputFile.txt > /tmp/temp.txt && cat /tmp/temp.txt > $HOME/inputFile.txt
命令运行后的输出:
xieerqi:$ awk '/^[[:digit:]]\.[[:digit:]]\.[[:digit:]]\.[[:digit:]]/ { printf $1; gsub (/http\:\/\//," "); gsub(/\.com/," ");printf " "$4"\n" }' inputFile.txt > /tmp/temp.txt && cat /tmp/temp.txt > $HOME/inputFile.txt
xieerqi:$ cat inputFile.txt
1.1.1.1 abcd
2.2.2.2 asdf
通过脚本简化
上面的命令可以放在一个脚本中,内容如下:
#!/usr/bin/awk -f
/^[[:digit:]]*\.[[:digit:]]*\.[[:digit:]]*\.[[:digit:]]*/ {
printf $1;
gsub (/http\:\/\//," ");
gsub (/https\:\/\//," ");
gsub(/\.com/," ");
printf " "$4"\n";
}
请注意,在脚本中,我考虑了 IP 地址中存在多个数字的可能性以及地址中 https 的可能性。
记得使用chmod 755 /path/to/script使脚本可执行
这是演示:
xieerqi:$ chmod 755 ipanddomain.awk
xieerqi:$ cat inputFile.txt
bigspeedpro.com Intel::DOMAIN from http://malc0de.com/bl/BOOT via intel.criticalstack.com F
1.1.1.1 Intel::DOMAIN from http://abcd.com/bl/BOOT via intel.criticalstack.com F
whatever.com Intel::DOMAIN from http://malc0de.com/bl/BOOT via intel.criticalstack.com F
192.168.0.2 Intel::DOMAIN from https://asdf.foobar.whatever.com/bl/BOOT via intel.criticalstack.com F
xieerqi:$ ./ipanddomain.awk inputFile.txt
1.1.1.1 abcd
192.168.0.2 asdf.foobar.whatever
要编辑原始文件,请使用重定向到临时文件并返回原始文件的技巧,就像我之前向您展示的那样
编辑#2
所以您问:是否可以简单地匹配您已经知道的域名的一部分才被打印出来。我已经稍微编辑了我的脚本。基本上,这个版本在 $4 字段中查找模式,如果找到,它会显示“好的,那个字符串里面有 abcd,所以我就打印那个”
#!/usr/bin/gawk -f
/^[[:digit:]]*\.[[:digit:]]*\.[[:digit:]]*\.[[:digit:]]*/ {
printf $1" ";
matchDomain($4);
}
function matchDomain(str){
if (str~/foobar/)
printf "foobar\n";
if(str~/abcd/)
printf "abcd\n"
}