[英]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地址開頭
from
到F
之間根據以下字符串出現情況替換它 我想使用sed,但我不知道如果sed
可以用於匹配多個字符串(例如malc0de或abc),也許我需要一個更完整的腳本,然后只需將一個字符串存儲在數組中即可。 任何想法? 順便說一下,使用sed
示例非常受歡迎。
至今
d
可以刪除行並將輸出重定向到文件 \\#!/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]}呢?或者我可以執行諸如from
和F
之間的.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.