SlideShare a Scribd company logo
レコード指向grep 
mlr-grep 
ryo1kato 
@github 
@gmail 
@twitter 
@facebook
grepで、複数行のパ 
ターンを検索したい 
! 
✦ 複数行ログとか、*.ini とか 
✦ ifconfig的な半構造化された出力 
2
例えば、こんなデータの 
$ cat data.txt 
[one] 
two 
three 
[foo] 
bar 
baz 
[hoge] 
piyo 
huga 
} キーワードを含むレコード行 
全体を取り出したい。 
3
よくやる方法としては… 
✦ grep -A 12 -B 34 -C 56 
✦ pcregrep --multiline 
✦ awk -v RS='nn' "/$re/" 
✦ perl -e … 
4
だけど… 
✦ AWKなら一応、そこそこ簡単に可 
能 
✦ pcregrep…正規表現がすごく長 
くなる 
✦元のレコードの「正しい抜粋」は 
難しい (gawkは可能だが困難) 
✦ perl … お好きにどうぞ 
5
更に、こんな便利機能も使いたい… 
✦ zgrep 
✦ grep -c (--count) 
✦ grep -i (--ignore-case) 
✦ grep -v (--invert-match) 
✦ grep --color 
6
そこで、作りました! 
✦mlr-grep 
✦Multi-Line Record Grep 
✦AWK, Haskell, Python版の3種 
✦ 機能は、ほぼ同じ 
7
例えば… 
} キーワードを含む 
$ amlgrep 'ba' … 
[foo] 
bar 
baz 
「レコード」全体を出力 
8
✦ amlgrep - AWK版 (gawk必須) 
✦ 一番早い。RHEL5やで --rs に一部難あり 
✦ *.{gz,bz2,xz} を自動で展開して読み込む。 
✦ --color, --count, --invert-match 
✦ 複数キーワードのAND, OR 
✦ hmlgrep - Haskell版 
✦ AWK版とほぼ同じ機能。ただし *.gz の自動展開は無し 
✦ 少し遅い(短い行が多いと1.5~2倍ほど遅い) 
✦ pymlgrep - Python版 
✦ 一番遅い(AWK版の4倍位) 
✦ 複数キーワードはサポートせず 
9
便利機能1 
複数キーワード 
10
$ amlgrep h t [--] [FILE] 
[one] 
two 
three 
[hoge] 
piyo 
huga 
≒ egrep 'h|t' 。でも少ないキータイプ数 
11
便利機能2 
-a, --and 
12
$ amlgrep -a h t … 
[one] 
two 
three 
≒ egrep 'h.*t|t.*h' 
でも、少ないキー(ry 
13
--timestamp 
! 
日付時刻入りの、 
複数行logファイルに 
14
$ cat datetime.log 
2014-01-23 12:34:56 log 1 
foo 
bar 
2014-01-24 12:34:57 log 2 
one 
two 
2014-01-25 12:34:58 log 3 
hoge 
piyo 
15
$ amlgrep -t 'one' … 
2014-01-24 12:34:57 log 2 
one 
two 
16
$ amlgrep -t --dump foo 
gawk -W re-interval -F n -v RS='n(((Mon| 
Tue|Wed|Thu|Fri|Sat),?[ t]+)?(Jan|Feb| 
Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Dec),? 
[ t]*[0-9]{1,2},?[ t][0-2][0-9]:[0-5] 
[0-9](:[0-5][0-9])?(,?[ t]20[0-9][0-9])?| 
20[0-9][0-9]-(0[0-9]|11|12)-(0[1-9]|[12] 
[0-9]|3[01]))' '-v' 'ORS=' 'oldRT $0 ~ / 
foo/ {i++;if(substr(oldRT,1,1)=="n") 
{h=substr(oldRT,2)}else{h=oldRT};;gsub(/ 
foo/,"&",h);print h;gsub(/foo/, 
"&");print;if(RT != "")printf "n"} 
{oldRT=RT} END{if (i>0){exit 0}else{exit 
1}}' 
17
レコード区切りを変えるには 
✦ --rs '^$' 
✦ 空行 
✦ --rs '^----' 
✦ 4つ(以上)のダッシュで始まる 
✦ --rs '^[[:alnum]]' 
✦ 行頭に文字がある (ifconfig的な出力) 
✦ --timestamp 
≒ -rs '^(((Mon|Tue|Wed|Thu|Fri|Sat),?[t]+)?(Jan|Feb|Mar|Apr|May|Jun| 
Jul|Aug|Sep|Oct|Dec),?[ t]*[0-9]{1,2},?[ t][0-2][0-9]:[0-5][0-9](: 
[0-5][0-9])?(,?[ t]20[0-9][0-9])?|20[0-9][0-9]-(0[0-9]|11|12)-(0[1-9]| 
[12][0-9]|3[01]))' 
18
http://github.com/ 
ryo1kato/mlr-grep 
19

More Related Content

What's hot (20)

PDF
5社のGTFSをマージして、PostgreSQLにインポートしてみた
Masaki Ito
 
PDF
Ag and ack
Joe_noh
 
PDF
awk v.s. bashどっちが強い?@OSC2011Tokyo
Ryuichi Ueda
 
ODP
(define)なしで再帰関数を定義する
blackenedgold
 
PDF
GNU awk (gawk) を用いた Apache ログ解析方法
博文 斉藤
 
PDF
ソースコードリーディングの基礎
hogemuta
 
PDF
Inquisitor -Common Lispに文字コード判定を-
t-sin
 
PDF
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」
Hiro H.
 
PDF
Cython intro prelerease
Shiqiao Du
 
PPTX
Node.js - sleep sort algorithm
takesako
 
PPT
python-geohex
遼 会田
 
PPT
BlockSorting
iuno
 
PDF
Haskell超初心者勉強会11
Takashi Kawachi
 
PDF
姫路IT系勉強会 Vol.11 第0回L-1グランプリ bash
Jun Nogata
 
PPTX
rpi_handson_2.5
teruyaono1
 
PPTX
C++のビルド高速化について
AimingStudy
 
PPT
IPv6アドレスでお絵かき
Yasuyuki Nakamura
 
PDF
Gitを理解するためにおさえておきたい3つの図(工事中)
Teloo
 
PDF
図でわかるGit
Teloo
 
PDF
Write good parser in perl
Jiro Nishiguchi
 
5社のGTFSをマージして、PostgreSQLにインポートしてみた
Masaki Ito
 
Ag and ack
Joe_noh
 
awk v.s. bashどっちが強い?@OSC2011Tokyo
Ryuichi Ueda
 
(define)なしで再帰関数を定義する
blackenedgold
 
GNU awk (gawk) を用いた Apache ログ解析方法
博文 斉藤
 
ソースコードリーディングの基礎
hogemuta
 
Inquisitor -Common Lispに文字コード判定を-
t-sin
 
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」
Hiro H.
 
Cython intro prelerease
Shiqiao Du
 
Node.js - sleep sort algorithm
takesako
 
python-geohex
遼 会田
 
BlockSorting
iuno
 
Haskell超初心者勉強会11
Takashi Kawachi
 
姫路IT系勉強会 Vol.11 第0回L-1グランプリ bash
Jun Nogata
 
rpi_handson_2.5
teruyaono1
 
C++のビルド高速化について
AimingStudy
 
IPv6アドレスでお絵かき
Yasuyuki Nakamura
 
Gitを理解するためにおさえておきたい3つの図(工事中)
Teloo
 
図でわかるGit
Teloo
 
Write good parser in perl
Jiro Nishiguchi
 

Similar to mlr-grep - レコード指向grep (20)

PDF
Application Developer Festival 2015 LT
Junpei Matsuda
 
PPT
How to debug a perl script using gdb
akirahiguchi
 
PDF
C++コンパイラ GCCとClangからのメッセージをお読みください
digitalghost
 
PDF
Lisp Tutorial for Pythonista : Day 3
Ransui Iso
 
PDF
マーク&スイープ勉強会
7shi
 
PDF
あまぁいRcpp生活
Masaki Tsuda
 
PDF
Tokyor23 doradora09
Nobuaki Oshiro
 
PPTX
URLで遊ぼう
Hiraku Nakano
 
PDF
One - Common Lispでもワンライナーしたい
t-sin
 
PPT
ZFSのソースコードをチラ見してみる
Koichi Suzuki
 
PDF
F#入門 ~関数プログラミングとは何か~
Nobuhisa Koizumi
 
PDF
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
Ouka Yuka
 
KEY
Clojure programming-chapter-2
Masao Kato
 
PDF
Java SE 8 lambdaで変わる プログラミングスタイル
なおき きしだ
 
PDF
HPC Phys-20201203
MITSUNARI Shigeo
 
PDF
C++コミュニティーの中心でC++をDISる
Hideyuki Tanaka
 
PDF
Unity2015_No10_~UGUI&Audio~
CHY72
 
PDF
ホームディレクトリに埋もれた便利なコードをさがせ!
Yohei Fushii
 
PDF
Rubysapporo Stringsearch
Akio Ishida
 
PDF
Everyday Life with clojure.spec
Kent Ohashi
 
Application Developer Festival 2015 LT
Junpei Matsuda
 
How to debug a perl script using gdb
akirahiguchi
 
C++コンパイラ GCCとClangからのメッセージをお読みください
digitalghost
 
Lisp Tutorial for Pythonista : Day 3
Ransui Iso
 
マーク&スイープ勉強会
7shi
 
あまぁいRcpp生活
Masaki Tsuda
 
Tokyor23 doradora09
Nobuaki Oshiro
 
URLで遊ぼう
Hiraku Nakano
 
One - Common Lispでもワンライナーしたい
t-sin
 
ZFSのソースコードをチラ見してみる
Koichi Suzuki
 
F#入門 ~関数プログラミングとは何か~
Nobuhisa Koizumi
 
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
Ouka Yuka
 
Clojure programming-chapter-2
Masao Kato
 
Java SE 8 lambdaで変わる プログラミングスタイル
なおき きしだ
 
HPC Phys-20201203
MITSUNARI Shigeo
 
C++コミュニティーの中心でC++をDISる
Hideyuki Tanaka
 
Unity2015_No10_~UGUI&Audio~
CHY72
 
ホームディレクトリに埋もれた便利なコードをさがせ!
Yohei Fushii
 
Rubysapporo Stringsearch
Akio Ishida
 
Everyday Life with clojure.spec
Kent Ohashi
 
Ad

mlr-grep - レコード指向grep