今回はSplunkで正規表現を使ってフィールドを抽出・置換します。
慣れないと難しいですが、思い通りに抽出できると気持ちいいです。
正規表現を使ったフィールド抽出
コマンド
rexコマンドを使って抽出します。
rex field=元フィールド (?P<抽出先フィールド名>フィールド値に含めるパターン)
Sample Code
FIELDをカンマ(,)とスペース( )を区切り文字として分解しています。
| makeresults | eval FIELD="aaa bbb ccc" | append [|makeresults | eval FIELD="eee, fff"] | append [|makeresults | eval FIELD="ggg, hhh iii"] | rex field=FIELD "(?P<FIELD1>^.*?)(\,\s|\s)" | rex field=FIELD "^.*?(\,\s|\s)(?P<FIELD2>\w+)" | rex field=FIELD "^.*(\,\s|\s).*?(\,\s|\s)(?P<FIELD3>\w+)" | fields - _time
結果

先頭ブロックの抽出
| rex field=FIELD "(?P<FIELD1>^.*?)(\,\s|\s)"
「^.*?」で先頭から抽出条件に最短マッチする値をFIELD1に抽出しています。
「(\,\s|\s)」で「カンマ+スペース」または「スペース」を抽出条件として指定しています。
2つ目のブロックの抽出
| rex field=FIELD "^.*?(\,\s|\s)(?P<FIELD2>\w+)"
「^.*?(\,\s|\s)」で先頭から「カンマ+スペース」または「スペース」までの最短マッチを指定し、「\w+」でアルファベット、数字、アンダスコアの繰り返しをFIELD2に抽出しています。
3つ目のブロックの抽出
| rex field=FIELD "^.*(\,\s|\s).*?(\,\s|\s)(?P<FIELD3>\w+)"
「^.(\,\s|\s).?(\,\s|\s)」で先頭から2つ目の「カンマ+スペース」または「スペース」までの最短マッチを指定し、「\w+」でアルファベット、数字、アンダスコアの繰り返しをFIELD3に抽出しています。
正規表現を使った置換
コマンド
sedを使って置換ができます。
rex field=置換するフィールド名 mode=sed “sedコマンド“
Sample Code
FIELDのカンマ(,)とスペース( )を@に置換しています。
| makeresults | eval FIELD="aaa bbb ccc" | append [|makeresults | eval FIELD="eee, fff"] | append [|makeresults | eval FIELD="ggg, hhh iii"] | eval FIELD_SED = FIELD | rex field=FIELD_SED mode=sed "s/(\,\s|\s)/@/g" | fields - _time
結果

まとめ
慣れないとコードの内容を理解するのが難しいですが、使いこなすと非常に便利なので、積極的に使ってマスターしたいですね。