はじめに
grepとxargsは、LinuxやUnix環境でファイル検索や一括処理を効率化する代表的なコマンドです。
単独でも便利ですが、組み合わせることで検索結果をそのまま別のコマンドへ渡し、複数ファイルの編集や削除、ログ調査などを短いコマンドで実現できます。
本記事では、基本から応用まで詳しく解説します
参考: GNU grep
grepとxargsの基本構文
ファイル作成
cat << 'EOF' > input.txt
apple
banana
orange
apple
grape
banana
EOF
実行コマンド
grep "banana" input.txt | xargs -I {} echo "Found: {}"
実行結果
Found: banana
Found: banana
実行コマンド
grep -v "apple" input.txt | xargs
実行結果
banana orange grape banana
仕組み
| コマンド | 役割 | 説明 |
|---|---|---|
| grep "apple" input.txt | 検索 | input.txtからappleを含む行を抽出する |
| grep "banana" input.txt | xargs -I {} echo "Found: {}" | 検索+引数展開 | grepの出力をxargsが1行ずつ受け取り、echoの引数として実行する |
| grep -v "apple" input.txt | xargs | 除外検索+引数結合 | apple以外の行を抽出し、xargsが空白区切りの引数として1行にまとめて出力する |
解説
grepはテキストから条件に一致する行を検索するコマンドです。
xargsを組み合わせることで、検索結果を別のコマンドの引数として受け渡し、効率よく一括処理できます。
grepとxargsで標準入力を受け渡す仕組み
ファイル作成
cat << 'EOF' > input.txt
apple
banana
grape
apple juice
orange
EOF
実行コマンド
grep "apple" input.txt | xargs -I {} echo "found: {}"
実行結果
found: apple
found: apple juice
実行コマンド
grep "apple" input.txt | xargs
実行結果
apple apple juice
仕組み
| コマンド | 役割 | 標準入力 | 標準出力 |
|---|---|---|---|
| grep "apple" input.txt | appleを含む行を検索 | input.txt | apple、apple juice |
| | | 前のコマンドの標準出力を次へ渡す | grepの出力 | xargsへ受け渡し |
| xargs -I {} echo "found: {}" | 標準入力を1行ずつ{}へ展開してコマンド実行 | grepの出力 | 加工した文字列を表示 |
| xargs | 標準入力を空白区切りの引数へ変換 | grepの出力 | apple apple juice |
解説
grepは検索結果を標準出力へ出力し、パイプ(|)によってその内容をxargsへ標準入力として渡します。
xargsは受け取ったデータをコマンドライン引数へ変換し、後続のコマンドへ受け渡すことで複数行のデータを効率よく処理できます。
grepとxargsで一致したファイルを一括処理する
ファイル作成
cat << 'EOF' > input.txt
apple
banana
apple pie
orange
pineapple
EOF
実行コマンド
grep -l "apple" *.txt | xargs -I {} wc -l {}
実行結果
5 input.txt
実行コマンド
grep -l "apple" *.txt | xargs -I {} cp {} {}.bak
実行結果
no output
実行コマンド
ls *.bak
実行結果
input.txt.bak
仕組み
| コマンド | 役割 |
|---|---|
| grep -l "apple" *.txt | appleを含むファイル名だけを出力する |
| xargs -I {} | 標準入力で受け取ったファイル名を{}へ渡してコマンドを実行する |
| wc -l {} | 対象ファイルの行数を表示する |
| cp {} {}.bak | 一致したファイルをまとめてバックアップする |
解説
grepで対象ファイルを抽出し、その結果をxargsへ渡すことで、一致したファイルに対して同じ処理を一括実行できます。
ファイル数が多い場合でも効率的に処理できる組み合わせです。
grepとxargsで複数条件を指定して検索する方法
ファイル作成
cat << 'EOF' > input.txt
ERROR Database connection failed
INFO Application started
WARN Disk usage is high
ERROR Authentication failed
INFO Backup completed
WARN Memory usage is high
ERROR Timeout occurred
DEBUG Cache initialized
EOF
実行コマンド
grep -E 'ERROR|WARN' input.txt | xargs -I {} echo "found:{}"
実行結果
found:ERROR Database connection failed
found:WARN Disk usage is high
found:ERROR Authentication failed
found:WARN Memory usage is high
found:ERROR Timeout occurred
仕組み
| 要素 | 説明 |
|---|---|
| grep -E 'ERROR|WARN' | -Eで拡張正規表現を使用し、ERRORまたはWARNに一致する行を検索する。 |
| xargs | 標準入力から受け取った各行を引数として後続コマンドへ渡す。 |
| -I {} | {}を入力行に置き換えてコマンドを実行する。 |
| echo "found:{}" | 検索結果の先頭にfound:を付けて表示する。 |
解説
grepで複数条件に一致した結果をxargsへ渡すことで、各行を任意の形式へ加工して出力できます。
echo以外のコマンドと組み合わせることで、検索結果に対するさまざまな処理を自動化できます。
grepとxargsで除外条件を指定する方法
ファイル作成
cat << 'EOF' > input.txt
error: disk full
info: process started
warning: memory usage high
error: permission denied
info: backup completed
warning: cpu temperature high
EOF
実行コマンド
grep -v '^info:' input.txt
実行結果
error: disk full
warning: memory usage high
error: permission denied
warning: cpu temperature high
実行コマンド
grep -v '^info:' input.txt | tr '\n' '\0' | xargs -0 -I {} echo "target: {}"
実行結果
target: error: disk full
target: warning: memory usage high
target: error: permission denied
target: warning: cpu temperature high
仕組み
| 項目 | 内容 |
|---|---|
| grep -v '^info:' | info:で始まる行を除外して出力する。 |
| | | grepの出力を次のコマンドへ渡す。 |
| -I {} | 入力された文字列を{}へ置き換えてコマンドを実行する。 |
| echo "target: {}" | 除外後の各行を引数として表示する。 |
解説
grepで不要な行を除外し、その結果だけをxargsへ渡すことで、必要なデータに対してのみコマンドを実行できます。
ログ解析やファイル処理を効率化する際によく利用される組み合わせです。
grepとxargsで安全にファイル名を扱う方法
ファイル作成
cat << 'EOF' > input.txt
apple
banana
target file.txt
target.log
orange
my target data.txt
EOF
実行コマンド
grep 'target' input.txt
実行結果
target file.txt
target.log
my target data.txt
実行コマンド
grep 'target' input.txt | xargs -I{} printf '[%s]\n' "{}"
実行結果
[target file.txt]
[target.log]
[my target data.txt]
仕組み
| 項目 | 内容 |
|---|---|
| grep 'target' | target を含む行だけを抽出する |
| xargs | grep の出力を受け取り、1行ずつコマンドの引数として渡す |
| -I{} | 取得した1行を {} に展開してコマンドへ渡す |
| printf '[%s]\n' "{}" | 受け取った文字列を [] で囲んで表示し、渡された引数を確認する |
解説
grep の結果を xargs に渡すことで、抽出した各行を別のコマンドの引数として順番に処理できます。
-I{} を指定すると、1行全体が {} に展開されるため、指定したコマンドへ分かりやすく受け渡せます。
grepとxargsでNULL区切りを扱う方法
ファイル作成
printf 'apple\0banana split\0orange\0apple pie\0grape\0' > input.txt
実行コマンド
grep -z "apple" input.txt | xargs -0 -I{} echo "MATCH: {}"
実行結果
MATCH: apple
MATCH: apple pie
実行コマンド
grep -z "banana" input.txt | xargs -0 -I{} printf '[%s]\n' "{}"
実行結果
[banana split]
実行コマンド
grep -zE "apple|banana" input.txt | xargs -0
実行結果
apple apple pie banana split
仕組み
| コマンド | 説明 |
|---|---|
| printf '...\0' > input.txt | NULL文字(\0)区切りのデータを作成する。 |
| grep -z | 入力をNULL区切りのレコードとして扱い、一致したレコードをNULL区切りで出力する。 |
| grep -zE | 拡張正規表現を使用して複数パターンを検索する。 |
| xargs -0 | NULL区切りの入力を安全に受け取り、引数としてコマンドへ渡す。 |
| xargs -0 -I{} | 入力ごとに{}へ展開してコマンドを実行する。 |
解説
grep -zとxargs -0を組み合わせることで、NULL区切りのデータを安全に処理できます。空白を含むデータ(banana splitやapple pie)も1つのレコードとして扱えるため、find -print0などと組み合わせる際によく利用されます。
grepとxargsで並列実行する方法
ファイル作成
cat << 'EOF' > input.txt
apple
banana
grape
apple juice
orange
banana milk
apple pie
melon
EOF
実行コマンド
grep "apple" input.txt | tr '\n' '\0' | xargs -0 -P2 -I{} sh -c 'echo "Processing: {}"; sleep 1'
実行結果
Processing: apple
Processing: apple juice
Processing: apple pie
仕組み
| 項目 | 内容 |
|---|---|
| grep | appleを含む行を抽出する |
| tr '\n' '\0' | 改行区切りをNULL文字区切りへ変換し、安全にxargsへ渡す |
| xargs -0 | NULL文字区切りの入力を受け取る |
| -P2 | 最大2プロセスを並列実行する |
| -I{} | 受け取った1件のデータを{}へ展開する |
| sh -c | 展開したデータを使用して任意のシェルコマンドを実行する |
解説
trで改行をNULL文字へ変換し、xargs -0で受け取ることで、空白を含む行も安全に処理できます。
-P2を指定すると、最大2つのプロセスが同時に実行され、処理時間を短縮できます。
grepとxargsで一括置換を行う方法
ファイル作成
cat << 'EOF' > input.txt
apple
orange
apple juice
banana
apple pie
EOF
実行コマンド
grep -l "apple" input.txt | xargs sed 's/apple/APPLE/g'
実行結果
APPLE
orange
APPLE juice
banana
APPLE pie
仕組み
| コマンド | 役割 |
|---|---|
| grep -l "apple" input.txt | appleを含むファイル名を出力する |
| xargs | 標準入力で受け取ったファイル名を引数として後続コマンドへ渡す |
| sed 's/apple/APPLE/g' | 対象ファイルのappleをすべてAPPLEへ一括置換する |
解説
grepで条件に一致するファイルだけを抽出し、その結果をxargsでsedへ渡すことで複数ファイルを効率よく一括置換できます。
対象ファイルが多い場合でも、手作業なしでまとめて処理できる方法です。
grepとxargsでログファイルを効率よく調査する
ファイル作成
cat << 'EOF' > input.txt
2026-07-29 10:00:01 INFO User login successful
2026-07-29 10:01:15 ERROR Database connection failed
2026-07-29 10:02:30 INFO File upload completed
2026-07-29 10:03:45 ERROR Network timeout occurred
2026-07-29 10:04:20 WARN Disk usage high
2026-07-29 10:05:10 ERROR Database query failed
EOF
実行コマンド
find . -name "*.log" | xargs grep "Database"
実行結果
./app.log:2026-07-29 10:01:15 ERROR Database connection failed
./app.log:2026-07-29 10:05:10 ERROR Database query failed
実行コマンド
find . -name "*.log" | xargs grep -n "ERROR"
実行結果
./app.log:2:2026-07-29 10:01:15 ERROR Database connection failed
./app.log:4:2026-07-29 10:03:45 ERROR Network timeout occurred
./app.log:6:2026-07-29 10:05:10 ERROR Database query failed
仕組み
| コマンド | 役割 | 動作 |
|---|---|---|
| grep | キーワード検索 | ログ内から指定文字列を抽出する |
| find | ファイル検索 | 調査対象のログファイルを取得する |
| xargs | 引数変換 | 標準入力をgrepなどのコマンド引数へ渡す |
| find + xargs + grep | 大量ログ調査 | 複数ログを効率的に横断検索する |
解説
grepはログ内容の検索、xargsは検索対象ファイルを効率的にコマンドへ渡す役割を持ちます。
大量のログファイルを調査する場合、find | xargs grep の組み合わせが有効です。
grepとxargsで不要ファイルを安全に削除する方法
ファイル作成
mkdir -p work
ファイル作成
touch work/file1.log
ファイル作成
touch work/file2.log
ファイル作成
touch work/file3.txt
ファイル作成
touch work/debug.log
ファイル作成
touch work/readme.md
実行コマンド
ls work
実行結果
debug.log file1.log file2.log file3.txt readme.md
実行コマンド
ls work | grep '.log$' | xargs -r -I {} rm "work/{}"
実行結果
no output
実行コマンド
ls work
実行結果
file3.txt readme.md
仕組み
| コマンド | 役割 |
|---|---|
| ls work | ディレクトリ内のファイル一覧を表示する |
| grep '\.log$' | .logで終わるファイルだけを抽出する |
| xargs -r -I {} rm "work/{}" | 抽出したファイル名をrmへ安全に渡して削除する |
| -r | 入力が空の場合はrmを実行しない |
| -I {} | {}に受け取ったファイル名を展開する |
解説
grepで削除対象を絞り込み、その結果だけをxargs経由でrmへ渡すことで、不要なファイルのみを安全に削除できます。
-rを付けることで一致するファイルがない場合の不要な実行も防げます。
grepとxargsの活用ポイントまとめ
grepとxargsを組み合わせることで、検索から一括処理までを効率よく自動化できます。
基礎から順番に学び、実際の作業で活用しながら理解を深めていくことが重要です。
