dfirr

A Note on R How-to in Cybersecurity Investigation

contains演算子の構文糖をつくる

今回は思い付きの小ネタです。Rのstringrパッケージは一貫性が売りですが、やや冗長なところがあります。たとえば我々が行(ログの場合にはイベント)を絞り込むとき、大文字・小文字を区別せずにマッチさせたいことが多々あります。これをstringrで表現すると、次の通りです。

log_http |> 
  filter(str_detect(uri, fixed("union", ignore_case = TRUE)))

フィルターが1行だけならともかく、現場ではフィルターを重ねることが少なくないので、str_detect()が重たく感じます。もっと気軽にKQLのcontains的に使いたくて、containsに相当する演算子を作ってみました。

"%~%" <- function(string, pattern) {
  stringi::stri_detect_fixed(string, pattern, case_insensitive = TRUE)
}

こうすると、先ほどのフィルターは

log_http |> 
  filter(uri %~% "union")

と書けます。含まない場合には、

log_http |> 
  filter(!uri %~% "union")

でOK。スマホの画面にも収まる短さです。個人的に、めちゃくちゃ便利になりました。