使用sed或脚本解析,重新格式化日志文件?

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地址开头的内容都会删除该行
  • 如果以IP地址开头

    • 删除Intel :: DOMAIN
    • 之间根据以下字符串出现 from F替换它
    • 例如malc0de或abcd

我想使用,sed但我不知道如果sed可以用来匹配多个字符串,例如malc0de或abc或许我需要一个更完整的脚本然后只是一行存储字符串值在数组中.任何的想法?顺便说一句,使用的例子sed最受欢迎.

至今

  • 我知道d在sed中使用我可以删除行并将输出重定向到文件
  • 我知道如何匹配正则表达式而不是IP地址[^ a-zA-Z]
  • 我基于多项选择或字符串而无法更换
\#!/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
Run Code Online (Sandbox Code Playgroud)

或者我想保存像ARRAY =(malc0de abcd)

然后代替捕获组我可以做$ {ARRAY [2]}它会起作用吗?或者我可以做一些像.net子串匹配之间的东西 fromF我复制结果的字符串变量.然后搜索我的字符串,例如malc0de,如果找到替换匹配结果的搜索模式?但我不知道bash ......

更新 使用awk脚本我很干净

1.1.1.1 www.abc.com
1.1.2.2 def.com
2.2.2.2 mnx.dbc.net
Run Code Online (Sandbox Code Playgroud)

但是,我希望将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)

谢谢.

Ser*_*nyy 5

您提到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)