業務で使うbashワンライナー8選 ― ファイル検索・ログ集計・置換テンプレ

業務で頻出するbashの便利ワンライナーを8パターン収録。ファイル検索・ログ集計・一括リネーム・テキスト置換などコピペで動かせます。

サーバーで作業してると、毎回**findのオプション、xargsの構文、grepの再帰…**を思い出せずにググってる自分がいます(- -;

この記事は「もうググらなくて済むように」と思って、業務頻出のbashワンライナー8選をまとめたものです。

ちょっとした注意点として、

上記の癖だけ持っておくと、シェル芸も安全になります!
下記ワンライナー、すぐにコピペして試してみてください!

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

削除は取り消せません。 本番サーバーで実行する前は、必ず事前にバックアップを取り、rmecho に置き換えるなどして対象一覧を目視確認してください。パスの打ち間違いひとつで重大事故になります。

-print0xargs -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

jqJSONのフィルタ+整形でめちゃくちゃ便利。

cat data.json | jq ... で繋ぐ書き方をよく見ますが、jq はファイル引数を直接取れるので最後に渡す方がシンプルです。

パイプで繋ぐなら curl https://api.example.com/users | jq . のように使います。brew install jqapt install jq で入れられます(^^b