2013-02-14 83 views
2

我不知道如何去掉這些行中的「DST =」.. 這裏是我的命令(它返回它應該的),並且如果有更有效的方法或者更好的方式,隨時批評。使用awk去除返回值

awk '{print $10}' iptables.log |sort -u 

DST=96.7.49.64 
DST=96.7.49.65 
DST=96.7.50.64 
DST=98.27.88.26 
DST=98.27.88.28 
DST=98.27.88.45 
DST=98.27.88.50 

正如你所看到的,我需要從iptable日誌中獲取唯一的ip。

謝謝!

回答

1

,或者你可以把它在同一個進程,並使用awk的等效sub()功能,即

awk '{sub(/DST=/,"",$10); print $10}' iptables.log |sort -u 

更新:

反正是有牛逼關鍵只是在DST =不管它是在10號還是11號?

awk '$10~/^DST=/{sub(/DST=/,"",$10); print $10};$11~/^DST=/{sub(/DST=/,"",$11); print $11}' iptables.log | sort -u 

OR

awk '{for (i=9;i<13;i++) { 
if ($i ~ /^DST=/) { sub(/DST=/, "", $i); print $i} 
} 
}' iptables.log | sort -u 

注意,在這裏,你可以改變字段的範圍檢查和打印,我測試領域9-12只是舉例。像$i這樣的awk中的變量是指當前行中的i'th'元素,就像$ 1,$ 9,$ 87等等一樣。

因爲我沒有iptables.log來測試,所以我無法測試它除非確認awk語法不失敗。這不起作用,請張貼2-4個簡化數據樣本行。

IHTH

+0

你們rock..this工作..因此它更有效地保持在一個正確的..我知道明顯的隊長,只要確保,這將每2分鐘運行一次。謝謝! – sectech 2013-02-14 03:43:18

+0

這完全取決於,但在很多情況下,過程越少越好。觀看@Steve進行更新,如果未分類的數據適合您,那將是最有效的。祝你們好運。 – shellter 2013-02-14 04:20:14

+0

我有一個更新..這是工作,但我的iptables改變格式,並增加了一個空間,但並非所有的時間..所以我改變了$ 10到$ 11,它的工作,但後來有些回到10 :(有無論如何要鍵只是在DST =無論它是在10或11的空間嗎?讓我知道你是否需要確切的日誌條目來顯示。 – sectech 2013-02-18 19:05:28

1

,你可以管你的輸出結果通過sed將刪除DST =每行:

awk '{print $10}' iptables.log | sed 's/^DST=//' | sort -u 
+0

謝謝!那太完美了!好的老awk/sed :)有時我討厭從窗口背景來。 – sectech 2013-02-14 03:36:29

+0

感謝您的信任,但@shelter有一個更優雅的解決方案(我敢肯定你注意到!) – RustyBuckets 2013-02-14 03:45:00

2

如果你不介意的無序輸出,這是一個使用awk一個更好的辦法:

awk '!a[$10]++ { sub(/DST=/,"",$10); print $10 }' file 
+0

這一個沒有工作,但謝謝你!這返回了整個iptable日誌,而不僅僅是dst並將其剝離。 – sectech 2013-02-14 03:50:15

+0

@sectech:是的,我忘了在[最新版本](http://stackoverflow.com/posts/14867393/revisions)中打印$ 10。你有沒有嘗試更新的代碼? HTH。 – Steve 2013-02-14 03:51:59

+0

沒有工作,但離開DST = 98.27.88.50 – sectech 2013-02-14 14:42:47

1
awk '{split($10,a,"=");b[a[2]];next}END{for(i in b)print i}' iptables.log