asa*_*sad -1 regex linux bash ubuntu sed
我有一个案例,我需要一个文件post-process
.样本格式如下: -
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
Run Code Online (Sandbox Code Playgroud)
预期产量为: -
1.1.1.1 abcd
Run Code Online (Sandbox Code Playgroud)
解析如下: -
如果以IP地址开头
from
来 F
替换它我想使用,sed但我不知道如果sed
可以用来匹配多个字符串,例如malc0de或abc或许我需要一个更完整的脚本然后只是一行存储字符串值在数组中.任何的想法?顺便说一句,使用的例子sed
最受欢迎.
至今
d
在sed中使用我可以删除行并将输出重定向到文件Run Code Online (Sandbox Code Playgroud)\#!/bin/bash sed -i s/\[a-zA-Z]\/d test ./infile > testme.txt sed -i s/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/s+\Intel::DOMAIN\\s*from(.*?)\s+F\1malc0de
或者我想保存像ARRAY =(malc0de abcd)
然后代替捕获组我可以做$ {ARRAY [2]}它会起作用吗?或者我可以做一些像.net子串匹配之间的东西 from
和F
我复制结果的字符串变量.然后搜索我的字符串,例如malc0de,如果找到替换匹配结果的搜索模式?但我不知道bash ......
更新 使用awk脚本我很干净
Run Code Online (Sandbox Code Playgroud)1.1.1.1 www.abc.com 1.1.2.2 def.com 2.2.2.2 mnx.dbc.net
但是,我希望将ip地址后的第二列缩短为我自己选择的字符串,例如在第二列中我只接受
abc def mnx
一旦发现它只是替换整个字符串
1.1.1.1 abc
1.1.2.2 def
2.2.2.2 mnx
Run Code Online (Sandbox Code Playgroud)
谢谢.
您提到sed
解决方案是最受欢迎的,但我相信awk
最容易用于您的特定任务.这是我的解决方案:
awk '/^[[:digit:]]\.[[:digit:]]\.[[:digit:]]\.[[:digit:]]/ { printf $1; gsub (/http\:\/\//," "); gsub(/\.com/," ");printf " "$4"\n" }' inputFile.txt
Run Code Online (Sandbox Code Playgroud)
这个想法很简单:默认情况下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
Run Code Online (Sandbox Code Playgroud)
带临时文件传输的命令(注意我的inputFile.txt在我的主目录中,相应地调整该部分).注意:为了以防万一,始终始终备份原始文件!或者先运行命令的第一部分&&
,检查临时文件,如果愿意,可以将文件保存到原始文件中.
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
Run Code Online (Sandbox Code Playgroud)
命令运行后的输出:
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
Run Code Online (Sandbox Code Playgroud)
通过脚本简化
可以将上述命令放入具有以下内容的脚本中:
#!/usr/bin/awk -f
/^[[:digit:]]*\.[[:digit:]]*\.[[:digit:]]*\.[[:digit:]]*/ {
printf $1;
gsub (/http\:\/\//," ");
gsub (/https\:\/\//," ");
gsub(/\.com/," ");
printf " "$4"\n";
}
Run Code Online (Sandbox Code Playgroud)
请注意,在脚本中我已经考虑了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
Run Code Online (Sandbox Code Playgroud)
要编辑原始文件,请使用重定向到临时文件的技巧,然后像我之前向您展示的那样回到原始文件
编辑#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"
}
Run Code Online (Sandbox Code Playgroud)