Splunkで文字列を逆順にする。


THE REVERSE CIPHERをSplunkでやってみた。

reverse.zsh
echo 'Three can keep a secret, if two of them are dead.' | rev
reverse.py
message = 'Three can keep a secret, if two of them are dead.'
message[-1::-1]

とコマンドですぐにできる逆順への並び替え。

Splunkでやろうとすると、

reverse.spl
| makeresults 
| eval message = "Three can keep a secret, if two of them are dead."
| eval counter=mvrange(1,len(message) + 1)
| stats values(message) as message by counter
| sort 0 - counter
| eval txt=substr(message,counter,1)
| streamstats count as counter
| eval counter=counter + 25
| eval counter_txt="!!".printf("%c",counter)."##"
| stats values(eval(counter_txt.txt)) as reverse values(message) as message delim=""
| rex mode=sed field=reverse "s/!!.##(.)/\1/g"
| nomv reverse

と大事になる。

理由としては

  • マルチバリューを逆順にする関数がない。
    • mvsort()はAsciiコード順にしかならない
  • フィールド単位で操作は可能だけど、フィールド内の操作する関数が少ない。
  • ループできない。
  • list()は100文字制限がある。

ということもありvalues()でなんとか整列をさせようと頑張ったのがこの形。

reverse message
.daed era meht fo owt fi ,terces a peek nac eerhT Three can keep a secret, if two of them are dead.

となんとか完成。

頻繁に使うなら、外部pythonスクリプトを用意した方がいいかもしれません。