2012-10-25 136 views
2

我有一個bash腳本的字符串包含行日誌條目,如本:bash腳本:SED/AWK /正則表達式匹配的IP地址和替換

Oct 24 12:37:45 10.224.0.2/10.224.0.2 14671: Oct 24 2012 12:37:44.583 BST: %SEC_LOGIN-4-LOGIN_FAILED: Login failed [user: root] [Source: 10.224.0.58] [localport: 22] [Reason: Login Authentication Failed] at 12:37:44 BST Wed Oct 24 2012 

爲了澄清;在那裏列出的第一個IP「10.224.0.2」是提交此登錄嘗試失敗登錄的機器。有人試圖從日誌條目「10.224.0.58」中的第二個IP地址的計算機上登錄並失敗。如你目前所看到的是「IPADDRESS/IPADDRESS」,它是兩次使用相同信息的無用的IPADDRESS/IPADDRESS,這個IP地址「10.224.0.2」所以在這裏,我想用grep(或類似的)輸出第一個IP,然後將它傳遞給像host這樣的命令,以獲得反向主機並將其替換爲日誌輸出。

我想重申一下第二個IP「10.224.0.58」。我想找到這個IP,並用主機名替換它。

這不僅僅是這兩個特定的IP地址,任何IP地址。所以我想搜索1到3之間的4個整數,以3個滿分隔開。「

這是正確的表達方式嗎,還是這個問題複雜化了?

非常感謝。

+0

你想要的任何IP地址的模式或這個特定的一個文件? – detunized

+0

您需要提供一些更好的示例輸入,來自該輸入的預期輸出,解釋爲什麼當您已經知道它們時,您想在文件中找到這兩個特定IP地址,以及「變量」的含義 - 一個shell變量,一個awk變量?別的東西?你用什麼命令做「反向查找」? –

+0

我已經更新了這個問題,希望這可以澄清我的要求 – jwbensley

回答

7

更換一個固定的IP地址與主機名:

$ cat log | sed -r 's/10\.224\.0\.2/example.com/g' 

替換與主機名的所有IP地址:

$ cat log | sed -r 's/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/example.com/g' 

如果你想調用外部程序,這是很容易做到使用Perl(只需用您的查找工具替換host):

$ cat log | perl -pe 's/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/`host \1`/ge' 

Hopeful這足以讓你開始。

1

有各種各樣的方法來查找IP地址,這裏有一個。只需更換的「printf‘< < <%S >>>’」與「主機」或任何你的命令名在這GNU awk腳本:

$ cat tst.awk 
{ 
    subIp = gensub(/\/.*$/,"","",$4) 
    srcIp = gensub(/.*\[Source: ([^]]+)\].*/,"\\1","") 

    "printf '<<<%s>>>' " subIp | getline subName 
    "printf '<<<%s>>>' " srcIp | getline srcName 

    gsub(subIp,subName) 
    gsub(srcIp,srcName) 

    print 
} 
$ 
$ gawk -f tst.awk file 
Oct 24 12:37:45 <<<10.224.0.2>>>/<<<10.224.0.2>>> 14671: Oct 24 2012 12:37:44.583 BST: %SEC_LOGIN-4-LOGIN_FAILED: Login failed [user: root] [Source: <<<10.224.0.58>>>] [localport: 22] [Reason: Login Authentication Failed] at 12:37:44 BST Wed Oct 24 2012 
0

一派這一行命令在一起。但無法將目前的IP地址傳遞給ssh命令:

sed -n 's/\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}/\nip&\n/gp' test | grep ip | sed 's/ip//' | sort | uniq 

「測試」是sed命令正在搜索的