[問題] awk要擷取資訊會亂掉

作者: REIDO (NEET)   2016-08-23 20:50:26
https://www.space.ntu.edu.tw/navigate/s/169EE84AFE094594B31CA1F7ADDEDE1DQQY
上面是我的LOG取出有問題的部分,
我想抓出source的IP的前2碼然後sort + uniq計算次數
所以我用
grep 'SRC=[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*' \
/tmp/test.txt|sed 's/^.*SRC=//g'|awk '{FS="."} {print $1"."$2}'|sort|uniq -c
結果跑出的是
2 62.210
1 62.210.12.127.DST=10.2.7.1
後來我往前回推
grep 'SRC=[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*' \
/tmp/test.txt|sed 's/^.*SRC=//g'|awk '{FS="."} {print $1}'
62.210.12.127
62
62
grep 'SRC=[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*'
/tmp/test.txt|sed 's/^.*SRC=//g'
62.210.12.127 DST=10.2.7.1 LEN=40 TOS=0x00 PREC=0x00 TTL=240 I...
62.210.12.127 DST=10.2.7.1 LEN=40 TOS=0x00 PREC=0x00 TTL=240 I...
62.210.12.127 DST=10.2.7.1 LEN=40 TOS=0x00 PREC=0x00 TTL=240 I...
看起來awk無法把其中一筆的分隔給判斷好,但是問題在於IP用"."
分隔沒錯啊!請問是哪裡有問題?
作者: CaptainH (Cannon)   2016-08-23 21:11:00
我認真建議這種稍稍複雜的parsing 不要用 shell用個 python 或 perl 都簡單數倍
作者: yvb   2016-08-23 21:14:00
awk 'BEGIN{FS="."} {print $1"."$2}'
作者: REIDO (NEET)   2016-08-23 21:17:00
請問這樣會複雜嗎?我目前只有學vbird教的手法而已@yvb:謝謝成功了,請問問題是出在哪裡?
作者: yvb   2016-08-23 21:24:00
或者 awk -F "." '{print $1"."$2}' 也可以.問題在於預設先用空白斷完句了,你才設定FS,所以第二列才生效.而用BEGIN{}就是未讀入資料時就先執行了,或直接指定-F即生效.
作者: REIDO (NEET)   2016-08-23 21:55:00
感謝指點
作者: soem (流水)   2016-08-23 22:01:00
如果只要類似的效果是不是可以寫短一點?grep -Eo 'SRC=([0-9]+\.){2}' test.txt|sort|uniq -c或中間再多一個| grep -Eo '[0-9]+\.[0-9]+' |
作者: REIDO (NEET)   2016-08-24 20:14:00
我還沒測試,不過我想soem說的是正確的。其實我是把過去運作正常的指令不斷擴增才變這樣的。最初始只有把LOG中的IP抓出來這樣XD好像演化論的痕跡器官XD

Links booklink

Contact Us: admin [ a t ] ucptt.com