2011-11-29 34 views
2
178.139.20.52 - - [26/Nov/2011:08:21:13 +0000] "POST /test/LinkTest.cgi?e=PATTERN&t3=0:010015&t4=1322295671:587875&l=178.139.20.174&n=149 HTTP/1.1" 200 17 "-" "BOT/1.26" 

上面是我想要解析的日誌條目的類型。解析日誌並在1個命令中輸出2個字符串

我喜歡我的命令輸出:

178.139.20.52 PATTERN 

就如何實現這一目標的任何想法?

謝謝。

謝謝您的回答,我要做到這一點:

cat access_log | grep "LinkTest.cgi" | grep "26\/Nov\/2011" | awk -v FS="[ =&]" '{ print $1,$8 }' | sort -u 
+0

回聲「178.139.20.52模式」(IOW,你的問題沒有完全確定。) –

回答

1

用awk: 'INFILE' 的

內容

178.139.20.52 - - [26/Nov/2011:08:21:13 +0000] "POST /test/LinkTest.cgi?e=PATTERN&t3=0:010015&t4=1322295671:587875&l=178.139.20.174&n=149 HTTP/1.1" 200 17 "-" "BOT/1.26" 
在我的Linux機器

awk命令:

awk 'BEGIN { FS = "=" } { ip = substr($1, 0, index($1, " ") - 1); pattern = substr($2, 0, index($2, "&") - 1); printf "%s %s\n", ip, pattern }' infile 

結果:

178.139.20.52 PATTERN 
+0

謝謝,這工作正常。 – Rgonomike

2

怎麼樣使用GNU sed這種做法?

sed -r 's/^(\S+).*e=([^&]+)&.*/\1 \2/' 
2

如何使用awk

注意 - 這將工作,如果你的pattern不含=space&

awk -v FS="[ =&]" '{ print $1,$8 }' file

[jaypal:~/Temp] cat file 
178.139.20.52 - - [26/Nov/2011:08:21:13 +0000] "POST /test/LinkTest.cgi?e=PATTERN&t3=0:010015&t4=1322295671:587875&l=178.139.20.174&n=149 HTTP/1.1" 200 17 "-" "BOT/1.26" 


[jaypal:~/Temp] awk -v FS="[ =&]" '{ print $1,$8 }' file 
178.139.20.52 PATTERN 
+0

這一個完美的作品,我確實貓的文件。 cat access_log | grep「LinkTest.cgi」| grep「26 \/Nov \/2011」| awk -v FS =「[=&]」'{print $ 1,$ 8}'| sort -u – Rgonomike

+0

我想你可以通過簡單的'awk -v FS =「[=&]」'/ 26 \/Nov \/2011/{print $ 1,$ 8}來繞過'cat'和'grep'' access_log |排序-u'或'uniq'無論哪個都適合最好。 –

+0

感謝這些精度。 – Rgonomike

2

我覺得grep的不適合這個,它僅過濾基於圖案線條。您可以使用-o開關來打印符合該模式的文本,但我不知道如何在grep中提取/打印多個子字符串。

這個perl單線程怎麼樣?

perl -ne 'm/^\s*(\d+\.\d+\.\d+\.\d+).+?\?e=([^&]+)/ and print "$1 $2\n"'

+0

謝謝:)它也可以。 – Rgonomike

2

這個問題似乎得以確認,因爲我們不知道有什麼可以在PATTERN。這裏有一個出發點:

sed -e 's/ .*LinkTest.cgi?e=/ /' -e 's/&.*//' 
+0

謝謝,這也適用。 – Rgonomike