LoginSignup
0
0

さまざまな語句を一度に検索したい(grep, zcat, パイプライン)

Last updated at Posted at 2024-05-02

grepコマンドでファイル内に含まれる文字列を検索

ファイルの中身をチェックして、探したい文字列が含まれているかどうかを検索するコマンドがgrep(Global Regular Expression Print)で、以下のように使う。

$ grep -r "検索したい文字列" 探したいファイルがあるパス

検索したい文字列がTanaka Taroで、探したいファイルがあるパスが/home/documentsとした場合の使用例は、以下の通りである。

$ grep -r "Tanaka Taro" /home/documents

-rオプションを付けることによって、/home/documentsのサブディレクトリ内のファイルまで検索される。

今度は、応用の検索パターンを試してみよう。
応用の検索パターンでは、正規表現を使って検索する。
検索したい文字列が、「田中太郎」「たなか太郎」「田中たろう」「たなかたろう」の4パターンだとする。

これをコマンドにすると、このように利用する。

$ grep -r -E "(田中|たなか)(太郎|たろう)" /home/documents

-Eオプションを付けることで、検索したい文字列を正規表現を使って検索することができる。

カタカナで「タナカタロウ」まで検索に含める場合は、

$ grep -r -E "(田中|たなか|タナカ)(太郎|たろう|タロウ)" /home/documents

のように、「|」で分割を増やせば良い。

姓名の間にスペースがあったりなかったりする場合がある。(「田中 太郎」とか)
その時は、*?を使うと、検索したい文字列は次のように書ける。

(田中|たなか|タナカ) ?(太郎|たろう|タロウ)
(田中|たなか|タナカ) *(太郎|たろう|タロウ)

?,*はそれぞれ次のような意味を持っている。
?: 直前の表現が0回か1回登場
*: 直前の表現が0回以上連続して登場

つまり、上記の例に当てはめて考えると、?を使うと「半角スペースが0回か1回登場」、*を使うと「半角スペースが0回以上連続して登場」という意味となり、姓名の間に半角スペースが入っている場合も入っていない場合も検索することができる。

さらに、「Tanaka Taro」「tanaka taro」のように、アルファベット表記の名前も検索することになった場合、この時は、次のような方法で検索することができる。

$ grep -r -i -E "(田中|たなか|タナカ) *(太郎|たろう|タロウ)|tanaka +taro" /home/documents

-iオプションは、大文字と小文字の区別無しで検索する。つまり、「Tanaka Taro」や「tanaka taro」だけではなく、「taNaka tAro」や「TaNaKa tarO」のような文字列もこの検索条件で引っかかるようになる。

また、正規表現の+は次のような意味を持っている。
+: 直前の表現が1回以上連続して登場

つまり、tanaka +taroの場合、「tanaka」と「taro」の間に必ず半角スペースが1つ以上入っている文字列が検索対象となる。すなわち、「tanakataro」のような文字列は、「tanaka」と「taro」の間に半角スペースが入っていないので、検索結果として反映されない。

まとめ

grepコマンドは、次のように使用する。

$ grep -r "検索したい文字列" 探したいファイルがあるパス

主なオプションには次のようなものがある。
-r: 探したいファイルがあるパスとして指定したディレクトリが、さらに子ディレクトリを持っていた場合、子ディレクトリ内のファイルも再帰的に検索対象に含める。
-i: 検索したい文字列の大文字と小文字の区別無しで検索する。
-E: 正規表現を用いて文字列を検索したい場合に指定する。

grepに-rオプションを付けない場合

-rオプションを付けずにgrepコマンドを実行すると、「指定したファイルの中から、指定した内容を含む行を探す」という処理となる。

例えば、/home/user/access.logからerrorが含まれる行を表示させたい場合は、次のコマンドを実行する。

$ grep "error" /home/user/access.log

パイプラインでlessコマンドに出力を渡せば、出力結果が画面外に溢れることも防げる。

$ grep "error" /home/user/access.log | less

パイプラインの使い方

出力を渡す側のコマンド | 出力を受け取る側のコマンド

パイプラインは、複数繋げることもできる

何かのコマンド | 何かのコマンド2 | 何かのコマンド3

-vオプションを付けると、指定した文字列を含まない行を出力することができる。例えば、/home/user/access.logからerrorが含まれない行を出力するためには、次のコマンドを実行する。

$ grep -v "error" /home/user/access.log

読み込みたいファイルが圧縮ファイルの場合

読み込みたいファイルが.gz.tgzなどの圧縮ファイルの時は、zcatコマンドなどでファイルを展開しながら読み込むことができる。

$ zcat /home/user/access.log.gz | grep -v "error" /home/user/access.log | less

zcat: .gz, .tgz
xzcat: .xz
unzip -p: .zip

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0