簡體   English   中英

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

[英]Parsing, reformating log file using sed or perhaps a script?

我有一個案子,我需要對其進行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

預期產量為:-

1.1.1.1 abcd

解析為:

  • 任何不以IP地址開頭的內容都會刪除該行
  • 如果以IP地址開頭

    • 刪除Intel :: DOMAIN
    • fromF之間根據以下字符串出現情況替換它
    • 例如malc0de或abcd

我想使用sed,但我不知道如果sed可以用於匹配多個字符串(例如malc0de或abc),也許我需要一個更完整的腳本,然后只需將一個字符串存儲在數組中即可。 任何想法? 順便說一下,使用sed示例非常受歡迎。

至今

  • 我知道在sed中使用d可以刪除行並將輸出重定向到文件
  • 我知道如何為非IP地址匹配正則表達式[^ a-zA-Z]
  • 我被困在基於多種選擇或字符串的替換中
 \\#!/bin/bash sed -is/\\[a-zA-Z]\\/d test ./infile > testme.txt sed -is/\\([0-9]\\{1,3\\}\\.\\)\\{3\\}[0-9]\\{1,3\\}/s+\\Intel::DOMAIN\\\\s*from(.*?)\\s+F\\1malc0de 

或者我正在考慮像ARRAY =(malc0de abcd)進行保存

然后代替捕獲組,我可以執行$ {ARRAY [2]}呢?或者我可以執行諸如fromF之間的.net子字符串匹配的操作,將結果復制到字符串變量中。 然后搜索它以查找我的字符串,例如malc0de,如果find用匹配的結果替換了搜索到的模式? 但我不知道bash ...

用awk腳本更新我很干凈

 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

謝謝。

您提到了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),因此請使用temp文件。

演示:

我的輸入文件

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位於我的主目錄中,請相應地調整該部分)。 注意:始終總是備份原始文件,以防萬一! 或在&&之前運行命令的第一部分,檢查臨時文件,如果喜歡,請將文件分類為原始文件。

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"

}

試試這個小家伙:

sed -nE 's/(^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}) .* [htpsw:\/.]{4,8}([0-9a-z.]+)\.com.*$/\1 \2/p' > newfile

想法是使用分組() ,定義適當的組,而不是僅使用\\1 \\2等用組替換匹配的行。- -np組合用於僅顯示替換的行,並且僅在匹配模式時才替換行。 如果還要保持不匹配的行,請刪除-np

輸入文件:

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
bigspeedpro.com Intel::DOMAIN   from http://malc0de.com/bl/BOOT via intel.criticalstack.com     F
123.1.1.1 Intel::DOMAIN   from http://abcd12.bcd.com/bl/BOOT via intel.criticalstack.com     F
bigspeedpro.com Intel::DOMAIN   from https://malc0de.com/bl/BOOT via intel.criticalstack.com     F
87.1.4.1 Intel::DOMAIN   from http://abcdtdd.com/bl/BOOT via intel.criticalstack.com     F
bigspeedpro.com Intel::DOMAIN   from http://malc0de.com/bl/BOOT via intel.criticalstack.com     F
192.168.1.1 Intel::DOMAIN   from www.abcdbc12a.bdf12.com/bl/BOOT via intel.criticalstack.com     F

輸出新文件:

1.1.1.1 abcd
123.1.1.1 abcd12.bcd
87.1.4.1 abcdtdd
192.168.1.1 abcdbc12a.bdf12

更新:我更新了答案,更改了sed一點,現在它可以處理http/https/www並返回https/https/www.com 而且它仍然相對較短。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM