シェルスクリプトでファイルに特定の文字が含まれているかどうかを高速に判定する方法
はじめに
ファイルに特定の文字が含まれていたら処理を行う、という分岐を書くときにgrep
の実行結果を>/dev/null
に捨てる、という方法をとっていましたが、>/dev/null
を使わなくても良いということを知りました。
>/dev/null
を使う場合と比べてのメリットについても取り上げます。
検証環境
>/dev/null
を使ったやり方
今までは標準出力を無効化するために>/dev/null
を使っていました。
1から100まで書かれている100行のテキストファイルtest.txt
について、grep
を行い分岐処理を行ってみます。
まずはテストに使用するテキストファイルを作成します。
このファイルを使ってファイル内の文字列存在チェックを行ってみます。
実現できました。
grep -q
を使ったやり方
grep
に-q
オプションというものがあることを知りました。
こちらは標準出力には何も出力しませんが、実行結果をexitコードあるいは$?
で取得できる仕組みになっています。
先のコードをgrep -q
を使って書き直してみます。
速度に大きな違いがある
両方ともそれほど大きな違いが無いように見えますが、大きなデータファイルを操作するときには顕著な違いが生まれます。
1から10000000までの数字が書かれたデータファイルをgrep
するケースを試してみます。
何度か試してみましたが、grep -q
のほうが早いですね。
おそらく、grep -q
の方は検索結果が1件でも見つかった場合に以降の処理を中断しているため高速なのではないか?と思われます。
ひとこと
少しだけコードは短くなりますし、速度も早いということでgrep -q
を使うのが良さそうですね。
ディスカッション
コメント一覧
まだ、コメントがありません