auientの日常

ノンジャンルで書きたいことを書くブログ

パラグラフ単位のgrepをawkで

AIXgrepコマンドには-pオプションがあって、パラグラフ単位での検索ができる。デフォルトのパラグラフの区切りは空行で、-pに続けて引数を与えると区切りを変更できる。

$ grep -p regexp file.txt
$ grep -p'^#' regexp file.txt  #区切り文字を「^#」にする例

grepの-pオプションの書式。どってことないけど便利。

何気に便利なのでお気に入りだったのだが、家のMac OS Xgrepには-pオプションがなかった。そこでどうにかできないかと調べたところ、awkで代用できることが発覚。特殊変数のRS(レコードセパレータ)を空行にすれば良いぽい。

$ awk 'BEGIN{RS=""} /regexp/{printf("%s\n\n",$0)}' file.txt

awkのonelinerで。「\n\n」が微妙にお粗末な感じ。

これをシェル関数にしてとりあえず満足した。
ただし問題があって、これではRS(区切り文字)に正規表現が使えない。grep -pはできるのに。。。どうにかならんかな。

      • -

(8/21追記)
今の所下記のよーな感じになってます。

prgrep(){
    RE=$1 ;shift
    awk -v RS="" -v ORS="\n\n" -v key="${RE}" '$0 ~ key' $@
}