こんにちは、mnaganumaです。
今日は、Linuxコマンドの便利な組み合わせ技「xargsとgrepを使って特定の文字列を含むファイル一覧を作成する方法」について書いてみます。コマンドの合わせ技で便利なことができますよ。新人の時に教えてもらったものです。
はじめに
Windowsのテキストエディタのさくらエディタなど、GUIでgrep機能がついていると要らないんですけど、LinuxのCUIコマンドしか使えない端末とかだと、知っていると便利です。使うコマンドは、find/xargs/grepの3つです。
grepコマンドとは
まずは基本となるgrepコマンドについておさらいしましょう。
grepは、テキストデータから特定の文字列を検索するコマンドです。例えば、以下のように使用します。
$ grep "検索したい文字列" ファイル名
実行例:
$ grep "error" error_files.txt

このコマンドは、error_files.txtファイル内から「error」を含む行を表示します。
xargsコマンドとは
次に、xargsコマンドについて説明します。
xargsは、標準入力から受け取ったデータを引数として別のコマンドに渡すことができます。複数のデータを一度に処理できるため、大量のファイルや入力を扱う際に便利です。
xargsとgrepの組み合わせ
それでは本題の、xargsとgrepを組み合わせて特定の文字列を含むファイル一覧を作成する方法を見ていきましょう。
とりあえずやってみる
私は、現在のディレクトリ内にあるすべての.txtファイルから、「error」という文字列を含むファイルを探したいとします。
どうコマンドを書くか。
$ find . -name "*.txt" | xargs grep -l "error"
解説:
find . -name "*.txt"- カレントディレクトリから、拡張子が
.txtのファイルを探します。
- カレントディレクトリから、拡張子が
|(パイプ)- 前のコマンドの出力を次のコマンドの入力として渡します。
xargs grep -l "error"findで見つかったファイルをgrepコマンドに引数として渡し、「error」を含むファイル名を表示します。-lオプションは、マッチしたファイル名のみを表示するオプションです。
実行例:
まず、テスト用のファイルを作成します。
$ echo "This is a test file." > file1.txt
$ echo "This file contains an error." > file2.txt
$ echo "No issues here." > file3.txt
作成したファイルを確認します。
$ ls -1 *.txt
出力:
file1.txt
file2.txt
file3.txt

file1.txt、file2.txt、file3.txt以外にもtxtファイルがあったことを忘れていました💦
では、xargsとgrepを使って「error」を含むファイルを検索します。
$ find . -name "*.txt" | xargs grep -l "error"
出力:
./file2.txt

file2.txtが「error」を含むファイルであることが確認できました。余計なゴミログや、さっき試したファイルも引っかかりましたね💦
ファイル名にスペースが含まれる場合
ファイル名にスペースが含まれる場合、そのままでは正しく動作しないことがあります。その対策として、findとxargsに特定のオプションを追加します。
$ find . -name "*.txt" -print0 | xargs -0 grep -l "error"
解説:
-print0オプション(find)- 出力するファイル名の区切り文字をヌル文字(
\0)にします。
- 出力するファイル名の区切り文字をヌル文字(
-0オプション(xargs)- ヌル文字を入力の区切りとして処理します。
実行例:
スペースを含むファイル名を作成します。
$ echo "This file has a space and contains error." > "file with space.txt"
再度、検索コマンドを実行します。
出力:
$ find . -name "*.txt" -print0 | xargs -0 grep -l "error"
./file with space.txt
./file2.txt

スペースを含むファイル名も正しく表示されました。
応用編
特定のディレクトリ内での検索
特定のディレクトリ内で検索したい場合は、findコマンドでディレクトリを指定します。
実行例:
例えば、logsディレクトリ内の.logファイルから「failed」を含むファイルを探す場合。
$ find ./logs -name "*.log" | xargs grep -l "failed"
サブディレクトリ内も含めて検索
findコマンドはデフォルトでサブディレクトリも検索します。
実行例:
$ find . -name "*.conf" | xargs grep -l "setting"
検索結果をファイルに保存
検索結果をファイルに保存する場合は、リダイレクトを使います。
実行例:
$ find . -name "*.txt" | xargs grep -l "error" > error_files.txt
error_files.txtに結果が保存されます。
内容確認:
$ cat error_files.txt
出力:
./file2.txt
注意点
grepコマンドのオプション
-lオプション- マッチしたファイル名のみを表示します。内容は表示されません。
-rオプション- ディレクトリ内を再帰的に検索しますが、今回は
findでファイルを指定しているため不要です。
- ディレクトリ内を再帰的に検索しますが、今回は
まとめ
xargsとgrepを組み合わせることで、特定の文字列を含むファイル一覧を効率的に作成できます。ファイル名にスペースが含まれていても、適切なオプションを使用すればできます。
深いディレクトリ構造のファイル群から、特定の文字列を探し出すのに有用だと思います。2000年問題対応を思い出す・・・( ;∀;)
以上です。


コメント