[问题] 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