↓メインコンテンツへスキップ
  1. Blogs/

Linux実用ワンライナーチートシート|ファイル検索・ログ解析・プロセス・ネットワークをコマンド一発で調査する

5 分
Linux CLI
0222-nnn
著者
0222-nnn
猫が好き
目次

このチートシートの使い方
#

LinuxサーバーやWSLでは、容量の大きい場所や待受ポートを何度も調べます。コマンド名を覚えていても、必要なオプションや組み合わせを毎回調べると手が止まります。

このページは、やりたいことに合う実用的なワンライナーへすぐたどり着くための早見表です。Kubernetes公式のkubectlチートシートを参考に、目的からコマンドを引ける構成にしました。長い解説より、コピーして値を置き換えやすい例を優先しています。

対象読者は、Linuxコマンドの基本操作を経験しており、サーバー・WSL・コンテナなどの調査でCLIを使う人です。Linuxそのものの入門、Bash文法の完全な解説、高度なsed・awkプログラミングは扱いません。Docker・Kubernetes・Git・クラウドCLI固有の操作も範囲外です。

急いでいる場合は、次の目的から直接進んでください。

やりたいこと 参照先
ファイルを探す ファイル・ディレクトリを探す
ファイルの内容を探す ファイルの中身を検索する
ログを追う ログを調査する
件数や上位項目を出す データを抽出・集計する
ディスク逼迫の原因を探す ディスク容量を調べる
CPU・メモリを使うプロセスを探す プロセスを調べる
IP・経路・ポートを確認する ネットワークを調べる
APIのJSONを加工する JSON・APIを処理する
複数ファイルをまとめて処理する 複数ファイルをまとめて処理する
一覧の重複や差分を見る ファイルや一覧を比較する
古いファイルを安全に削除する 削除・変更を安全に行う

想定環境
#

コマンド例はBash上で実行します。Ubuntu・Debian・RHEL系Linuxと、WSL2上のGNU/Linuxが主な対象です。macOSなどのBSD系環境では、オプションが異なる場合があります。

固定した入力で再現できる例は、次のWSL2環境で実行確認しました。

Ubuntu 22.04.5 LTS
GNU bash 5.1.16
GNU coreutils 8.32
GNU findutils 4.8.0
GNU grep 3.7
GNU sed 4.8
GNU Awk 5.1.0
procps-ng 3.3.17
iproute2 5.15.0
curl 7.81.0
jq 1.6
ripgrep 15.2.0
systemd 249

fdを含む掲載例は、各ツールの公式マニュアルで構文を確認しました。さらに、fd以外のうち固定した入力で再現できる例を、同等のテストデータまたは現在のWSL2環境で確認しました。実行結果は、入力データ、権限、プロセス、ログ、ネットワークの状態によって変わります。

コマンドとプレースホルダー
#

find・grep・awk・sed・sort・uniq・cut・xargs・ps・ip・ssを標準的な環境で使いやすいコマンドとして扱います。curlやjournalctlも一般的ですが、最小構成の環境には入っていない場合があります。

rg(ripgrep)・fd・jqは追加導入するツールです。rgとfdは、既定で隠しファイルや.gitignoreに一致するファイルを除外します。詳細はripgrepの自動フィルタとfdのHidden and ignored filesで確認できます。

次の名前は例です。自分の環境に合わせて置き換えます。

例示値 置き換えるもの
app.log 調査するログファイル
config.conf 調査する設定ファイル
nginx サービス名またはプロセス名
https://example.com 確認するURL
/var/log/app 対象を確認したディレクトリ

.は現在のディレクトリ以下を表します。検索や変更の範囲を実行前に確認してください。権限が足りない場合も、すべてのコマンドへ機械的にsudoを付けず、必要な対象だけに使います。

ワンライナーの基本
#

出力を次のコマンドへ渡す
#

command1 | command2

command1の標準出力をcommand2の標準入力へ渡します。複数の処理をつなぐ基本形です(BashのPipelines)。

成功した場合だけ次を実行する
#

command1 && command2

command1の終了ステータスが0の場合だけ、command2を実行します。

失敗した場合だけ次を実行する
#

command1 || command2

command1が0以外で終了した場合だけ、command2を実行します。

ファイルへ上書き・追記する
#

command > output.txt
command >> output.txt

>はファイルを上書きし、>>は末尾へ追記します。既存ファイルに>を使うと内容が失われます(BashのRedirections)。

標準エラーも表示しながら保存する
#

command 2>&1 | tee output.log

標準エラーを標準出力へまとめ、画面表示とファイル保存を同時に行います。

パイプ途中の失敗も検知する
#

set -o pipefail

Bashでは、通常のパイプラインの終了ステータスは最後のコマンドで決まります。pipefailを有効にすると、途中の失敗をパイプライン全体へ反映できます(BashのPipelines)。スクリプトでcurl ... | jq .などを成否判定に使う場合は検討してください。

コマンドの結果を変数へ入れる
#

VALUE=$(command)

$()の中を実行し、標準出力から末尾に連続する改行を削除した結果を変数へ格納します。途中にある改行は残ります。

ファイル・ディレクトリを探す
#

拡張子からファイルを探す
#

find . -type f -name '*.log'

現在のディレクトリ以下から、名前が.logで終わる通常ファイルを探します。シェルによる展開を防ぐため、*.logを引用符で囲みます。

fdを導入済みなら、拡張子を短く指定できます。Ubuntu・Debianでは、パッケージやバージョンによって実行名がfdfindの場合があります。

fd -e tf
fdfind -e tf

大文字小文字を無視して名前を探す
#

find . -type f -iname '*terraform*'

-inameは、ファイル名の大文字小文字を区別しません。

100MiBを超えるファイルを探す
#

find . -type f -size +100M -print

GNU findのMは1,048,576バイト単位です。+100Mは、100単位より大きいファイルに一致します(GNU Findutils Manual)。

24時間以内に更新されたファイルを探す
#

find . -type f -mtime -1 -print

-mtimeは24時間単位で端数を切り捨てます。-1は、経過した24時間単位が1未満のファイルに一致します。

10分以内に更新されたファイルを探す
#

find . -type f -mmin -10 -print

分単位で探す場合は-mminを使います。

ファイルの中身を検索する
#

ディレクトリ以下を再帰検索する
#

grep -rni -- 'error' .

-rで再帰検索し、-nで行番号、-iで大文字小文字を無視します。--以降はオプションではないため、検索語が-で始まっても区別できます。

開発リポジトリでrgを導入済みなら、次の形でも検索できます。

rg -n 'ERROR' .
rg -n -g '*.tf' 'google_compute' .

2つ目は、対象をTerraformファイルに絞ります。

同じ行に2つの文字列を含む行を探す
#

grep -F 'ERROR' app.log | grep -F 'database'

最初のgrepの結果をもう一度絞ります。この例のAND条件は、同じ行に両方の文字列がある場合だけ一致します。

複数の文字列のどれかを含む行を探す
#

grep -Ei -- 'error|warning|critical' app.log

-Eで拡張正規表現を使い、|でOR条件を作ります。

一致した行の前後も表示する
#

grep -n -C 5 -- 'ERROR' app.log

一致行の前後5行を表示します。-Aは後、-Bは前だけを表示します(GNU grepのContext Line Control)。

ログを調査する
#

ログをリアルタイムで追う
#

tail -F app.log

-Fはファイル名を追跡します。ログローテーションで同名ファイルが作り直された場合も再度開きます。

ERRORだけをリアルタイムで見る
#

tail -F app.log | grep --line-buffered -i -- 'error'

--line-bufferedは、一致した行ごとに出力をフラッシュします(GNU grepのOther Options)。

ERRORまたはWARNをリアルタイムで見る
#

tail -F app.log | grep --line-buffered -Ei -- 'error|warn'

複数の深刻度を同時に追う場合の形です。

ログの直近100行を見る
#

tail -n 100 app.log

ファイル全体を開かず、末尾だけを確認します。

systemdサービスのログを見る
#

journalctl -u nginx --since '1 hour ago'
journalctl -u nginx -f

1つ目は直近1時間、2つ目は新しいログを継続表示します。サービス名が違う環境ではnginxを置き換えます(journalctl)。ログの閲覧権限がない場合は、所属グループや必要な権限を確認してください。

データを抽出・集計する
#

行ごとの出現回数を数える
#

sort file.txt | uniq -c | sort -nr

uniqは隣接する重複行を処理するため、先にsortします。最後に件数を数値の降順へ並べます(GNU Coreutilsのuniq)。

出現回数の上位10件を表示する
#

sort file.txt | uniq -c | sort -nr | head -n 10

集計結果の先頭10件だけを表示します。

アクセス元IPの上位10件を表示する
#

awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n 10

アクセス元IPが第1フィールドにあるApache・nginxの一般的なアクセスログを想定しています。ログ形式が違う場合は、抽出するフィールドを変更してください。

必要な列だけを表示する
#

awk '{print $1, $3}' file.txt

awkは既定で空白区切りの入力をフィールドへ分け、$1、$2のように参照します(GNU Awk User’s Guide)。引用符や改行を含むCSVは、この方法では正しく解析できません。

列の値が条件に合う行だけ表示する
#

awk '$3 >= 100 {print $1, $3}' file.txt

第3フィールドが100以上の行から、第1・第3フィールドを表示します。

/etc/passwdからアカウント名を表示する
#

cut -d: -f1 /etc/passwd

区切り文字を:、表示するフィールドを1番目に指定します。一般ユーザーだけでなく、システムアカウントも含まれます。

指定した範囲の行を表示する
#

sed -n '100,150p' file.txt

自動出力を-nで止め、100〜150行目だけをpで表示します(GNU sedのCommand-Line Options)。

コメントと空行を除いて設定を見る
#

grep -Ev -- '^[[:space:]]*(#|$)' config.conf

行頭の空白に続く#と、空白だけの行を除外します。設定値の後ろにあるインラインコメントは残ります。

ディスク容量を調べる
#

ファイルシステムの使用量を見る
#

df -h

マウントされたファイルシステムの容量を、人が読みやすい単位で表示します。

直下のディレクトリを容量順に並べる
#

du -xh --max-depth=1 . | sort -hr

-xで別のファイルシステムへまたがらず、現在地の直下を集計します。--max-depthとsort -hはGNU系のオプションです(GNU Coreutilsのdu)。

容量の大きいファイルを20件表示する
#

find . -xdev -type f -printf '%s\t%p\n' \
  | sort -nr \
  | head -n 20 \
  | numfmt --field=1 --to=iec

バイト数で並べてから、表示時だけIEC単位へ変換します。find -printfとnumfmtはGNU環境を前提とします。ファイル名に改行が含まれる場合、この改行区切りの例では1ファイルを正しく表示できません。

inodeの使用量を見る
#

df -ih

空き容量があっても新しいファイルを作れない場合は、inodeの枯渇も確認します。

プロセスを調べる
#

名前からプロセスを探す
#

pgrep -af nginx

-fでコマンドライン全体を検索し、-aでPIDとコマンドラインを表示します(pgrep(1))。一致するプロセスがなければ終了ステータスは1です。

CPU・メモリ使用率の高いプロセスを見る
#

ps aux --sort=-%cpu | head -n 11
ps aux --sort=-%mem | head -n 11

1行目のヘッダーと、上位10プロセスを表示します。psの%CPUは、プロセスの生存期間全体に対するCPU時間の割合です。瞬間的な利用率ではありません(ps(1))。

一定間隔で繰り返し確認する
#

watch -n 2 'ps aux --sort=-%cpu | head -n 11'

2秒ごとにコマンドを再実行します。watchは終了するまで端末を占有します(watch(1))。

ネットワークを調べる
#

IPアドレスを簡潔に表示する
#

ip -br addr

インターフェース名、状態、IPアドレスを1インターフェース1行で表示します。

ルーティングテーブルを見る
#

ip route

既定経路や宛先ネットワークごとの経路を表示します。

特定宛先に使われる経路を見る
#

ip route get 8.8.8.8

カーネルが選ぶインターフェース、ゲートウェイ、送信元IPを確認します(ip-route(8))。実際にパケットを送る疎通確認ではありません。

LISTENポートとプロセスを見る
#

ss -lntp
ss -lntp 'sport = :8080'

1つ目はTCPの待受ポート、2つ目はローカルの8080番に絞ります。-pのプロセス情報は、実行ユーザーの権限によって表示されない場合があります(ss(8))。

確立済みのTCP接続を見る
#

ss -tn state established

TCP状態がestablishedの接続だけを表示します。

Name Service Switch経由で名前解決する
#

getent hosts example.com

/etc/nsswitch.confに設定されたName Service Switch経由でhostsデータベースを検索します(getent(1))。DNSだけを直接問い合わせるコマンドではありません。

HTTPステータスコードだけを表示する
#

curl -sS -o /dev/null -w '%{http_code}\n' https://example.com

HTTP応答を取得できた場合は、レスポンスボディを捨ててステータスコードを表示します。接続・名前解決・TLSなどで失敗した場合は、-Sによりエラーも表示されます。

curlは既定ではHTTP 4xx・5xxを転送エラーとしません。終了ステータスも失敗にしたい場合は-fを追加します(curlマニュアル)。

JSON・APIを処理する
#

jqは追加導入するツールです。-rは文字列をJSONの引用符なしで出力するため、別のコマンドへ渡す場合に向いています(jq Manual)。

APIレスポンスを整形する
#

curl -fsS https://api.github.com/repos/jqlang/jq | jq .

curl -fでHTTPエラーを失敗として扱い、-sSで進捗を隠しつつエラーを表示します。スクリプトでパイプ全体の成否を見る場合は、先にset -o pipefailを有効にします。

特定フィールドの値を取り出す
#

jq -r '.name' file.json

トップレベルのnameを文字列として表示します。

配列から特定フィールドを取り出す
#

jq -r '.items[].name' file.json

items配列の各要素からnameを取り出します。

条件に合う要素だけ取り出す
#

jq -r '.items[] | select(.status == "RUNNING") | .name' file.json

statusがRUNNINGの要素だけに絞り、nameを表示します。

複数フィールドをTSVに変換する
#

jq -r '.items[] | [.name, .status, .ip] | @tsv' file.json

3つのフィールドをタブ区切りで出力します。表計算ソフトやawkへ渡す場合に使えます。

複数ファイルをまとめて処理する
#

ファイル名を安全に渡してgzip圧縮する
#

まず対象を確認します。

find . -type f -name '*.log' -print

問題がなければ、元ファイルを残すgzip -kで圧縮します。

find . -type f -name '*.log' -print0 | xargs -0 -r gzip -k

-print0とxargs -0は、ファイル名をNUL文字で区切ります。空白や改行を含む名前も1つの引数として渡せます。

詳しい理由はGNU Findutils Manualにあります。xargs -rはGNU系のオプションです。

最大4ファイルを並列でgzip圧縮する
#

find . -type f -name '*.log' -print0 | xargs -0 -r -n1 -P4 gzip -k

-n1は1回のgzipへ1ファイルずつ渡し、-P4は最大4プロセスを並列実行します。ストレージやCPUへの負荷が増えるため、環境に合わせて並列数を決めてください。

ファイルや一覧を比較する
#

重複している行だけを表示する
#

sort file.txt | uniq -d

重複行を1回ずつ表示します。件数も必要ならuniq -cを使います。

2つの一覧の片方だけにある行を表示する
#

comm -23 <(sort -u old.txt) <(sort -u new.txt)
comm -13 <(sort -u old.txt) <(sort -u new.txt)

1つ目はold.txtだけ、2つ目はnew.txtだけにある値を集合として表示します。sort -uで並べ替えと重複除去を行ってから、commへ渡します(GNU Coreutilsのcomm)。<(...)はBashのプロセス置換で、POSIX shでは使えません(BashのProcess Substitution)。

削除・変更を安全に行う
#

古いログを確認してから削除する
#

最初は-printで対象だけを表示します。

find /var/log/app -type f -name '*.log' -mtime +30 -print

対象が正しいことを確認してから、同じ条件で削除します。

find /var/log/app -type f -name '*.log' -mtime +30 -delete

-mtimeは24時間単位で端数を切り捨てます。+30は、切り捨てた日数が30より大きいファイルに一致します。

削除前後の考え方はGNU Findutils Manualでも説明されています。

パスが空の変数になるような書き方や、対象未確認のrm -rfは早見表に含めません。

よく使うワンライナー早見表
#

find . -type f -name '*.log'
grep -rni -- 'error' .
tail -n 100 app.log
sort file.txt | uniq -c | sort -nr | head -n 10
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -n 10
grep -Ev -- '^[[:space:]]*(#|$)' config.conf
du -xh --max-depth=1 . | sort -hr
df -ih
pgrep -af nginx
ps aux --sort=-%mem | head -n 11
ss -lntp
ip route get 8.8.8.8
curl -sS -o /dev/null -w '%{http_code}\n' https://example.com
jq -r '.items[].name' file.json
journalctl -u nginx -f

ファイル名・URL・サービス名を自分の環境へ置き換えます。削除や上書きを伴うコマンドは、早見表から直接実行せず、対象確認の節へ戻ってください。

まとめ
#

  • ワンライナーは、取得・絞り込み・抽出・集計・並べ替えの順に組み立てる
  • ファイル名をxargsで別のコマンドへ渡す場合は、-print0とxargs -0を組み合わせる
  • rg・fdは隠しファイルと無視対象を既定で除外する
  • パイプラインをスクリプトで成否判定する場合は、pipefailを検討する
  • 変更・削除する場合は、同じ検索条件で対象を表示してから実行する
  • GNU固有オプションとBash固有構文は、macOSやPOSIX shでそのまま使えるとは限らない

参考資料
#

関連記事

Cloud Monitoringで取れるか調べる手順(定義はあるのに時系列は0件だった)
8 分
GoogleCloud CloudMonitoring CLI
よく使うCloud Monitoringメトリクスまとめ(集計を変えたら同じCPU使用率が3倍になった)
4 分
GoogleCloud CloudMonitoring CLI
よく使うCloud Loggingクエリまとめ(絞り込みから「出ない」ときの確認まで)
5 分
GoogleCloud CloudLogging CLI
よく使うansibleコマンドまとめ(ad-hocからplaybook・Vaultまで)
5 分
Ansible Docker CLI
よく使うgit・ghコマンドまとめ(ブランチ作成からPRマージまで)
5 分
Git GitHub CLI