小ネタ
mvmap()
を使用していますので、バージョン7.3以上推奨
VER 2.0ができました。
octet.binv2.spl
| makeresults count=1112
| streamstats current=f count
| where match(count,"^[01]?[01]?[01]?[01]$")
| eval count =printf("%04d",count)
| stats list(count) as hex2bin
| eval counter = mvappend(mvrange(0,10),split("abcdef",""))
| eval IP = "10.171.230.151"
| fillnull oct_1 oct_2 oct_3 oct_4
| foreach oct_*
[ eval <<FIELD>> = mvindex(split(IP,"."),<<MATCHSTR>> - 1)
| eval <<FIELD>>_upper = printf("%x",floor(<<FIELD>> / 16))
| eval <<FIELD>>_lower = printf("%x",(<<FIELD>> % 16))
| eval <<FIELD>>_upper=mvindex(hex2bin,mvfind(counter,<<FIELD>>_upper))
| eval <<FIELD>>_lower=mvindex(hex2bin,mvfind(counter,<<FIELD>>_lower))
| eval result=mvappend(result,<<FIELD>>_upper,<<FIELD>>_lower)]
| table IP result
| eval result=mvjoin(result," ")
下にある以前のバージョンと比べてもやってることがスッキリした。
mvmap()
の使用をやめたので、ver7以降だと普通に動くと思います。
解説
printf()の解説をみていたら、
printf("%x,%X,%p",10,10,10) which returns a,A,A
ができることに気づいた。
これは使える。
16進数から2進数への表は作っていたので、あとはカウンター処理をしていくだけ。
mvappend()
のところは動かないかもと思っていたけど、無事に動いてくれた。
まとめ
16進数にしてしまえば、なんとかなるし、関数も用意されているから、他にも使えると思います。
古いバージョン
octet_bin.spl
| stats count
| fields - count
| eval IP = "10.171.230.151"
| eval oct_1="",oct_2="",oct_3="",oct_4=""
| eval temp=mvrange(0,1112)
| eval temp=mvfilter(match(temp,"^[01]?[01]?[01]?[01]$"))
| eval hex2bin=mvzip(mvappend(mvrange(0,10),split("abcdef","")),mvmap(temp,printf("%04d",temp)))
| foreach oct_*
[ eval <<FIELD>> = mvindex(split(IP,"."),<<MATCHSTR>> - 1)
| eval <<FIELD>>_base16=split(printf("%x",<<FIELD>>),"")]
| foreach oct_*_base16
[ eval oct_<<MATCHSTR>>_bin=mvmap(<<FIELD>>,mvfind(hex2bin,'<<FIELD>>'))]
| foreach oct_*_bin
[ eval <<FIELD>>=mvmap(<<FIELD>>,replace(mvindex(hex2bin,<<FIELD>>),"^.,",""))
| eval <<FIELD>>=if(mvcount(<<FIELD>>)=1,mvappend("0000",<<FIELD>>),<<FIELD>>)]
| table IP oct_*_bin
| eval octet_bin=mvjoin(mvappend(oct_1_bin,oct_2_bin,oct_4_bin,oct_4_bin)," ")
ここに対抗して、なんとかできるかと作り始めたら、なかなか大変だった。
基本的にテキストマッチングで作っているので、元ネタと違って計算していない。
2進数に直にできるといいのだけど、あるのかな?
マルチバリューでやっていくとごちゃごちゃしてしまっているのが・・・
元ネタのように、全てシングルにバラしてやるともっとすっきりできると思いました。