業務で使うbashワンライナー8選 ― ファイル検索・ログ集計・置換テンプレ
業務で頻出するbashの便利ワンライナーを8パターン収録。ファイル検索・ログ集計・一括リネーム・テキスト置換などコピペで動かせます。
サーバーで作業してると、毎回**findのオプション、xargsの構文、grepの再帰…**を思い出せずにググってる自分がいます(- -;
この記事は「もうググらなくて済むように」と思って、業務頻出のbashワンライナー8選をまとめたものです。
ちょっとした注意点として、
-print0とxargs -0はスペース入りファイル名対策teeでログとファイル両方へ出力可set -euo pipefailをスクリプト先頭に書くと事故減
上記の癖だけ持っておくと、シェル芸も安全になります!
下記ワンライナー、すぐにコピペして試してみてください!
1. ファイル名で検索
用途: 大量のファイルから名前で対象を見つけたいとき
find . -type f -name "*.log" -mtime -7
-mtime -7 で **「過去7日以内に更新されたログファイル」**を抽出。
-name は大文字小文字区別あり。区別なくしたいなら -iname を使うと便利です(^^b
2. 再帰的にテキスト検索
用途: ディレクトリ配下から特定の文字列を探したいとき
grep -rn "TODO" --include="*.js" --include="*.ts" --include="*.jsx" --include="*.tsx" .
-r で再帰、-n で行番号、--include で対象拡張子を絞り込みます。
ちなみに --include="*.{js,ts}" のような brace展開はgrepでは効かないので、拡張子ごとに --include を並べるのが正解です。
ripgrep(rg)が入ってる環境ならそっちの方が10倍速いので、rg "TODO" -t js あたりがおすすめです(^^!
3. ファイルを検索して削除
用途: 古いログや一時ファイルをまとめて削除したいとき
find /tmp -type f -name "*.tmp" -mtime +30 -print0 | xargs -0 rm -f
⚠ 削除は取り消せません。 本番サーバーで実行する前は、必ず事前にバックアップを取り、rm を echo に置き換えるなどして対象一覧を目視確認してください。パスの打ち間違いひとつで重大事故になります。
-print0 と xargs -0 をペアで使うと、スペース入りファイル名も安全に処理できます。
削除系は事前に find ... -print で対象を確認するクセを付けておくと、誤削除を防げます。
4. ファイル行数の集計
用途: ディレクトリ配下のコード行数を集計したいとき
find . -type f -name "*.js" -exec wc -l {} + | sort -n
wc -l で行数を出して、sort -n で数値ソート。
cloc というツールも便利で、言語別の行数を一覧で出してくれます。brew install cloc で導入できますね(^^b
5. アクセスログから上位を集計
用途: ログから最頻出のIPやパスを抽出したいとき
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -20
Apache/Nginxアクセスログの **「上位20のIPアドレス」**を集計するパターン。
$1 を $7 に変えればパス別、$NF に変えれば末尾フィールド別、と応用できます(^^!
6. ファイル一括置換
用途: 複数ファイルから特定ファイルを一括置換したいとき
find . -type f -name "*.md" -exec sed -i 's/旧文字列/新文字列/g' {} +
⚠ 破壊的操作です。 カレント以下の対象ファイル全てを書き換えるので、実行前に git commit するか、-i.bak でバックアップを残す ことを強くおすすめします。
Linux向けの書き方です。macOS(BSD sed)では -i の直後にバックアップ拡張子を必ず指定する必要があり、空でも sed -i '' のように空文字を渡します(^^b
7. ログを追跡しながら絞り込み
用途: リアルタイムログから ERROR だけ表示したいとき
tail -f app.log | grep --line-buffered -E "ERROR|FATAL"
--line-buffered が地味に重要。
これを忘れると、バッファリングされて表示が遅れます。リアルタイム監視には必須のオプションですね(^^!
8. jqでJSONを整形・抽出
用途: APIレスポンスやログのJSONから特定フィールドを取り出すとき
jq '.users[] | select(.active == true) | {id, name, email}' data.json
jq は JSONのフィルタ+整形でめちゃくちゃ便利。
cat data.json | jq ... で繋ぐ書き方をよく見ますが、jq はファイル引数を直接取れるので最後に渡す方がシンプルです。
パイプで繋ぐなら curl https://api.example.com/users | jq . のように使います。brew install jq か apt install jq で入れられます(^^b