LoginSignup
1
0

More than 3 years have passed since last update.

SplunkでIPv4を二進数表記にする

Last updated at Posted at 2020-01-27

小ネタ
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ができることに気づいた。
これは使える。:smirk:
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進数に直にできるといいのだけど、あるのかな?
マルチバリューでやっていくとごちゃごちゃしてしまっているのが・・・
元ネタのように、全てシングルにバラしてやるともっとすっきりできると思いました。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0