2013-01-22 76 views
-1

我需要幫助才能從文件中提取巧合。Shell腳本linux減法參數grep

我捕獲網絡流量使用tcpdump命令

tcpdump的-Xvv -i eth0的> captureFile.txt

鑑於指定找到的所有值的IP報頭,TCP和以太網的任何領域捕獲的流量並計算該域的值多少倍。例如,如果假設TTL = 128 TTL = 64,則指示具有每個這些值的字段有多少個數據包。

文件的內容:

09:26:13.245546 IP (tos 0x0, ttl 1, id 3439, offset 0, flags [none], proto UDP (17), length 1018) 
10.0.0.226.58935 > 239.255.255.250.3702: UDP, length 990 
    0x0000: 4500 03fa 0d6f 0000 0111 ada8 0a00 00e2 E....o.......... 
    0x0010: efff fffa e637 0e76 03e6 7ec0 3c3f 786d .....7.v..~.<?xm 
    0x0020: 6c20 7665 7273 696f 6e3d 2231 2e30 2220 l.version="1.0". 
    0x0030: 656e 636f 6469 6e67 3d22 7574 662d 3822 encoding="utf-8" 
    0x0040: 3f3e 3c73 6f61 703a 456e 7665   ?><soap:Enve 
09:26:13.339173 IP6 (hlim 1, next-header UDP (17) payload length: 998) fe80::21e9:f54b:9ae7:6383.58936 > ff02::c.3702: UDP, length 990 
    0x0000: 6000 0000 03e6 1101 fe80 0000 0000 0000 `............... 
    0x0010: 21e9 f54b 9ae7 6383 ff02 0000 0000 0000 !..K..c......... 
    0x0020: 0000 0000 0000 000c e638 0e76 03e6 666c .........8.v..fl 
    0x0030: 3c3f 786d 6c20 7665 7273 696f 6e3d 2231 <?xml.version="1 
    0x0040: 2e30 2220 656e 636f 6469 6e67   .0".encoding 
09:26:13.407313 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.0.3.118 tell 10.0.1.215, length 46 
    0x0000: 0001 0800 0604 0001 0009 0fcb 0a0c 0a00 ................ 
    0x0010: 01d7 0000 0000 0000 0a00 0376 0000 0000 ...........v.... 
    0x0020: 0000 0000 0000 0000 0000 d9c4 62a8  ............b. 
09:26:13.525954 IP (tos 0x0, ttl 128, id 3441, offset 0, flags [none], proto UDP (17), length 161) 
10.0.0.226.59131 > 239.255.255.250.1900: UDP, length 133 
    0x0000: 4500 00a1 0d71 0000 0111 b0ff 0a00 00e2 E....q.......... 
    0x0010: efff fffa e6fb 076c 008d 6fa6 4d2d 5345 .......l..o.M-SE 
    0x0020: 4152 4348 202a 2048 5454 502f 312e 310d ARCH.*.HTTP/1.1. 
    0x0030: 0a48 6f73 743a 3233 392e 3235 352e 3235 .Host:239.255.25 
    0x0040: 352e 3235 303a 3139 3030 0d0a   5.250:1900.. 
09:26:13.557002 IP (tos 0x0, ttl 1, id 3442, offset 0, flags [none], proto UDP (17), length 161) 
10.0.0.226.59131 > 239.255.255.250.1900: UDP, length 133 
    0x0000: 4500 00a1 0d72 0000 0111 b0fe 0a00 00e2 E....r.......... 
    0x0010: efff fffa e6fb 076c 008d 6fa6 4d2d 5345 .......l..o.M-SE 
    0x0020: 4152 4348 202a 2048 5454 502f 312e 310d ARCH.*.HTTP/1.1. 
    0x0030: 0a48 6f73 743a 3233 392e 3235 352e 3235 .Host:239.255.25 
    0x0040: 352e 3235 303a 3139 3030 0d0a   5.250:1900.. 
09:26:13.642734 IP (tos 0x0, ttl 1, id 21767, offset 0, flags [none], proto UDP (17), length 684) 
10.0.0.237.58882 > 239.255.255.250.3702: UDP, length 656 
    0x0000: 4500 02ac 5507 0000 0111 6753 0a00 00ed E...U.....gS.... 
    0x0010: efff fffa e602 0e76 0298 5568 3c3f 786d .......v..Uh<?xm 
    0x0020: 6c20 7665 7273 696f 6e3d 2231 2e30 2220 l.version="1.0". 
    0x0030: 656e 636f 6469 6e67 3d22 7574 662d 3822 encoding="utf-8" 
    0x0040: 3f3e 3c73 6f61 703a 456e 7665   ?><soap:Enve 
09:26:13.642960 IP6 (hlim 1, next-header UDP (17) payload length: 664) fe80::b8a2:bd0:4e0b:1bb5.58883 > ff02::c.3702: UDP, length 656 
    0x0000: 6000 0000 0298 1101 fe80 0000 0000 0000 `............... 
    0x0010: b8a2 0bd0 4e0b 1bb5 ff02 0000 0000 0000 ....N........... 
    0x0020: 0000 0000 0000 000c e603 0e76 0298 248c ...........v..$. 
    0x0030: 3c3f 786d 6c20 7665 7273 696f 6e3d 2231 <?xml.version=" 
09:26:13.642999 IP (tos 0x0, ttl 64, id 21767, offset 0, flags [none], proto UDP (17), length 684) 
10.0.0.237.58882 > 239.255.255.250.3702: UDP, length 656 
    0x0000: 4500 02ac 5507 0000 0111 6753 0a00 00ed E...U.....gS.... 
    0x0010: efff fffa e602 0e76 0298 5568 3c3f 786d .......v..Uh<?xm 
    0x0020: 6c20 7665 7273 696f 6e3d 2231 2e30 2220 l.version="1.0". 
    0x0030: 656e 636f 6469 6e67 3d22 7574 662d 3822 encoding="utf-8" 
    0x0040: 3f3e 3c73 6f61 703a 456e 7665   ?><soap:Enve 

的結果必然是:

ttl 64 - 1 time 
ttl 128 - 1 time 
ttl 1 - 3 times 
+0

'grep「whatyouwanttosearch」captureFile.txt | wc -l'就夠了? –

+1

@DavideBerra你不需要這個,grep有-c選項 – Kent

+0

事實上,有時我會忘記明顯;) –

回答

2

我認爲這將是與您的預期產出完全相同。

grep -ioP 'ttl \d+' file|awk '{a[$0]++}END{for(x in a)print x" - "a[x]" times"}' 

輸出爲:

ttl 1 - 3 times 
ttl 64 - 1 times 
ttl 128 - 1 times 

以及不準確一樣,因爲我沒有檢查時間和次數..你真的需要嗎?它可以輕鬆完成。

編輯

爲OP要求,輸出時間/時間取決於計數:

grep -ioP 'ttl \d+' file|awk '{a[$0]++}END{for(x in a)print x" - "a[x]" time"(a[x]>1?"s":"")}' 

輸出:

ttl 1 - 3 times 
ttl 64 - 1 time 
ttl 128 - 1 time 
+0

如果是可行的檢查時間和時間將是偉大的:) – Litox

+0

@CarlosLensGrela請參閱編輯,時間(s)在那裏。 – Kent

+0

非常感謝很多人!你是上帝!如果可能的話,你可以幫我這個 - > http://stackoverflow.com/questions/14461964/get-information-from-a-file-shell-script-linux-grep-command – Litox

0

兩種方法:

如果你有perl

captureFile.txt | 
perl -ne '/ttl (\d+),/ and $TTL{$1}++; 
    END { for my $ttl (keys %TTL) {print "* ttl $1 - $TTL{$ttl} time\n"}}' 

應該做的它。但我認爲uniq -c還可以與grep工作...

captureFile.txt | egrep -o 'ttl ([0-9]+)' | uniq -c 

而且得到你要求的確切輸出格式,只需添加這之後uniq -c

| awk '{print "* ttl "$3" - "$1" time"}' 
0
grep "ttl [0-9]*" captureFile.txt -o 

僅會得到有關文本文件的一部分。

grep "ttl [0-9]*" captureFile.txt -o | 
awk 'NF{ count[ toupper($0) ]++} 
END{ for (name in count) { print "*" name " - " count[ name ] " times" 
}; 
}' 

會得到你想要的格式。

0

這是一個有點長,我敢肯定,它可以進行重構了不少,但如果你不這樣做它的工作原理|無法安裝perl

grep ttl captureFile.txt | awk '{print $5,$6}' | sed 's/,//' | sort | uniq -c | awk '{print $2,$3,"-",$1,"times"}'

+0

cat | grep | awk | sed | sort | uniq | awk ...哪裏是連接,粘貼...? – Kent

+0

它工作正常。但是,如果我需要其他標題,如偏移量或ID? – Litox

+0

@Kent我知道它非常冗長,但我在記住調用'perl -ne'的特定語法時相當不好。我敢肯定,如果我仔細考慮一下,我會設法加入並粘貼到那裏:) –

0

簡單awk腳本:

$ awk -F, '/ttl/{u[$2]++}END{for(k in u)print k" - "u[k]" time"(u[k]>1?"s":"")}' 
ttl 128 - 1 time 
ttl 64 - 1 time 
ttl 1 - 3 times 

無需浪費子流程。

+0

很好的答案。兩條評論。 1)better/ttl [0-9] + /因爲文本可以「解決」2)OP已經評論了其他人的答案,他也想得到一些其他參數。 ID,偏移量,這就是爲什麼我認爲grep | awk對他更容易。當然你的線也可以工作,但是人必須改變/.../和字段索引。 awk是一個強大的核武器,我不能同意更多,如果有其他工具的幫助,它可以使生活更輕鬆,爲什麼不呢?你知道我不是指sed | awk | grep | sed | sed | awk .. :) – Kent