このページは福井県立大学の田中求之が2006年1月まで運用していた Mac のサーバ運用に関する会議室 「Web Scripter's Meeting」の記録です。情報が古くなっている可能性がありますのでご注意ください。

行単位でのgrepはどうするのでしょうか

発言者:望月 崇
( Date Sunday, March 14, 1999 12:57:50 )


JEDIT2をレジストしたので、AppleScript関係のホームページを漁ってgrep機能を使えないか調べています。
unixで
grep 検索語 file名
とやると、通常検索語を含む「行」だけを抜き出してくれますが、これをjeditで実現したいのです。
mgrep OSAXやjperlのサンプルを見てみたのですが、マッチする単語を抜き出す仕様になっていて、行を丸々抜き出すように変更する方法がわかりません。

unixは仕事で使いますけど、ASは初心者で、難しいです。
ご存じの方、コメントをお願いします。

山谷 さんからのコメント
( Sunday, March 14, 1999 18:14:38 )

mgrep OSAX の作者の Iimori さんがリリースされている MgrepApp だと、
matchLinePos と matchLineText がとれます。

Jedit2 は使用していないのでよくわかりませんが、AppleEvent aware な TextEditor と
OSAX でやるとするなら、1 line づつ切り出して、その上で regexp をかけるという感じ
でしょうか。

jperl は使っていませんのでわかりません。

山本 武 さんからのコメント
( Sunday, March 14, 1999 23:35:24 )

 ちょっと姑息ですが ”.*単語.*” ってのはどうでしょうか?
 私も多分似たようなスクリプトを組んで実際使っていますが用は足りていますよ。
 私のHPでも一部紹介していますのよければ参考にして下さい。
 下のHPでApplescript/〜に降りて下さい。
 それと、JperlってのはMacJPerlとは違うんですか?

→  Hora's HP

野本夏俊 さんからのコメント
( Sunday, March 14, 1999 23:40:00 )

mgrep OSAX のドキュメントを読めば分かることですが、
正規表現を"^("と")$"で挟めば行を抜き出せます。
たとえば
"abcd
efgh
ijkl"
が検索対象xであるとして、gを含む行を抜き出すなら、

mgrep x regex "^(.*g.*)$
で
{matchPos:6, subMatchStr:{"efgh"}, matchLen:4}
が返ります。
ただし、最初にヒットした行を返すだけですから、gを
含むすべての行を抜き出したいならループを組む必要があります。

望月 崇 さんからのコメント
( Monday, March 15, 1999 21:05:26 )

ありがとうございます。やはり行を切り出してのループ処理が必須
なのですね。これはASでやると大変です...
対象が1MBくらいのログファイルを想定しているんですが、処理AS
側の処理だけでどれくらいかかるか...
スクリプトを作り込んでみます。

野本夏俊 さんからのコメント
( Tuesday, March 16, 1999 01:52:17 )

>対象が1MBくらいのログファイルを想定しているんですが、処理AS
>側の処理だけでどれくらいかかるか...

1MBぐらいなら、なんとかなる範囲内だと思いますよ。
こちらも参考になるかも知れません。↓

→  大きなデータを処理するときのコツ

田中求之 さんからのコメント
( Tuesday, March 16, 1999 17:48:57 )

検索に正規表現を使わなくてもよい(ある単語が含まれているかどうかといった、
単純な検索)なら、Tanaka's osax の MT Pick Lines も使えます。この osax は
ヒープ領域にバッファを取って、そのバッファ単位でファイルを読み込んでは
検索していきますので、ファイルの大きさは何メガあっても問題が起きない
ようになっています。

もちろん、ヒットした行をリストにして返します。

栗田哲郎 さんからのコメント
( Saturday, March 20, 1999 19:47:50 )

http://www.lazerware.com/software.html
にある、RegEx Commandsというのが、まさに正規表現にMatchした行をすべて
抜き出すという事をやっていくれます。

望月 崇 さんからのコメント
( Saturday, March 20, 1999 21:21:35 )

jgawkを使う事であっさり実現できてしまいました。
set theDenial to "! " ( "" )---パターンを含まない、あるいは含む

set theResult to Evaluate "jgawk '" & theDenial & "/^.*(" & theRegEx & ").*$/' << " & return & theString

とすることで、しっかり処理できました。
スピードも、300KB程度で5秒程度と充分な速度が実現できました。
(PB2400/G3 240MHz)結構、ASってべんりですね。