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

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

What's hot (20)

5社のGTFSをマージして、PostgreSQLにインポートしてみた
5社のGTFSをマージして、PostgreSQLにインポートしてみた5社のGTFSをマージして、PostgreSQLにインポートしてみた
5社のGTFSをマージして、PostgreSQLにインポートしてみた
 
Ag and ack
Ag and ackAg and ack
Ag and ack
 
awk v.s. bashどっちが強い?@OSC2011Tokyo
awk v.s. bashどっちが強い?@OSC2011Tokyoawk v.s. bashどっちが強い?@OSC2011Tokyo
awk v.s. bashどっちが強い?@OSC2011Tokyo
 
(define)なしで再帰関数を定義する
(define)なしで再帰関数を定義する(define)なしで再帰関数を定義する
(define)なしで再帰関数を定義する
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
 
ソースコードリーディングの基礎
ソースコードリーディングの基礎ソースコードリーディングの基礎
ソースコードリーディングの基礎
 
Inquisitor -Common Lispに文字コード判定を-
Inquisitor -Common Lispに文字コード判定を-Inquisitor -Common Lispに文字コード判定を-
Inquisitor -Common Lispに文字コード判定を-
 
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelerease
 
Node.js - sleep sort algorithm
Node.js - sleep sort algorithmNode.js - sleep sort algorithm
Node.js - sleep sort algorithm
 
python-geohex
python-geohexpython-geohex
python-geohex
 
BlockSorting
BlockSortingBlockSorting
BlockSorting
 
Haskell超初心者勉強会11
Haskell超初心者勉強会11Haskell超初心者勉強会11
Haskell超初心者勉強会11
 
姫路IT系勉強会 Vol.11 第0回L-1グランプリ bash
姫路IT系勉強会 Vol.11 第0回L-1グランプリ bash姫路IT系勉強会 Vol.11 第0回L-1グランプリ bash
姫路IT系勉強会 Vol.11 第0回L-1グランプリ bash
 
rpi_handson_2.5
rpi_handson_2.5rpi_handson_2.5
rpi_handson_2.5
 
C++のビルド高速化について
C++のビルド高速化についてC++のビルド高速化について
C++のビルド高速化について
 
IPv6アドレスでお絵かき
IPv6アドレスでお絵かきIPv6アドレスでお絵かき
IPv6アドレスでお絵かき
 
Gitを理解するためにおさえておきたい3つの図(工事中)
Gitを理解するためにおさえておきたい3つの図(工事中)Gitを理解するためにおさえておきたい3つの図(工事中)
Gitを理解するためにおさえておきたい3つの図(工事中)
 
図でわかるGit
図でわかるGit図でわかるGit
図でわかるGit
 
Write good parser in perl
Write good parser in perlWrite good parser in perl
Write good parser in perl
 

Similar to mlr-grep - レコード指向grep

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

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

Application Developer Festival 2015 LT
Application Developer Festival 2015 LTApplication Developer Festival 2015 LT
Application Developer Festival 2015 LT
 
How to debug a perl script using gdb
How to debug a perl script using gdbHow to debug a perl script using gdb
How to debug a perl script using gdb
 
C++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みくださいC++コンパイラ GCCとClangからのメッセージをお読みください
C++コンパイラ GCCとClangからのメッセージをお読みください
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
 
マーク&スイープ勉強会
マーク&スイープ勉強会マーク&スイープ勉強会
マーク&スイープ勉強会
 
あまぁいRcpp生活
あまぁいRcpp生活あまぁいRcpp生活
あまぁいRcpp生活
 
Tokyor23 doradora09
Tokyor23 doradora09Tokyor23 doradora09
Tokyor23 doradora09
 
URLで遊ぼう
URLで遊ぼうURLで遊ぼう
URLで遊ぼう
 
One - Common Lispでもワンライナーしたい
One - Common LispでもワンライナーしたいOne - Common Lispでもワンライナーしたい
One - Common Lispでもワンライナーしたい
 
ZFSのソースコードをチラ見してみる
ZFSのソースコードをチラ見してみるZFSのソースコードをチラ見してみる
ZFSのソースコードをチラ見してみる
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
 
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルJava SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイル
 
HPC Phys-20201203
HPC Phys-20201203HPC Phys-20201203
HPC Phys-20201203
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
 
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!
 
Rubysapporo Stringsearch
Rubysapporo StringsearchRubysapporo Stringsearch
Rubysapporo Stringsearch
 
Everyday Life with clojure.spec
Everyday Life with clojure.specEveryday Life with clojure.spec
Everyday Life with clojure.spec
 

mlr-grep - レコード指向grep