awk要擷取資訊會亂掉 - Linux

Table of Contents

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用"."
分隔沒錯啊!請問是哪裡有問題?

--
最近你的吸引力將大幅上漲,周遭的異性將慢慢的被你迷惑,慢慢的開始愛上你......。

唯一美中不足的是───────那群異性中有一半以上是齧齒目,其餘的則是爬蟲類。


或是你也可以換個樂觀的角度───愛上你的只有不到一半是爬蟲類,其餘都是齧齒目。

--

All Comments

Frederic avatarFrederic2016-08-25
我認真建議這種稍稍複雜的parsing 不要用 shell
用個 python 或 perl 都簡單數倍
Puput avatarPuput2016-08-26
awk 'BEGIN{FS="."} {print $1"."$2}'
Sandy avatarSandy2016-08-29
請問這樣會複雜嗎?我目前只有學vbird教的手法而已
Barb Cronin avatarBarb Cronin2016-08-30
@yvb:謝謝成功了,請問問題是出在哪裡?
Valerie avatarValerie2016-09-02
或者 awk -F "." '{print $1"."$2}' 也可以.
Joseph avatarJoseph2016-09-05
問題在於預設先用空白斷完句了,你才設定FS,所以第二列才生效.
Sierra Rose avatarSierra Rose2016-09-09
而用BEGIN{}就是未讀入資料時就先執行了,或直接指定-F即生效.
Jake avatarJake2016-09-09
感謝指點
Hazel avatarHazel2016-09-13
如果只要類似的效果是不是可以寫短一點?
grep -Eo 'SRC=([0-9]+\.){2}' test.txt|sort|uniq -c
Hardy avatarHardy2016-09-15
或中間再多一個| grep -Eo '[0-9]+\.[0-9]+' |
Mia avatarMia2016-09-20
我還沒測試,不過我想soem說的是正確的。其實我是把過去
運作正常的指令不斷擴增才變這樣的。
Damian avatarDamian2016-09-23
最初始只有把LOG中的IP抓出來這樣XD
好像演化論的痕跡器官XD