Back

Linux テキスト処理チートシート

Linux テキスト処理チートシート

2GBのログファイルを前に、過去1時間の失敗したAPIコールを探している。あるいは、CSVエクスポートからメールアドレスを抽出する必要がある。こうしたタスクのために、わざわざPythonスクリプトを書く必要はありません。

このチートシートでは、grepawksedなどの必須Linuxテキスト処理コマンドとその最新版を、フロントエンドおよびフルスタック開発の日常的なワークフローで使える実践的な例とともに解説します。

重要なポイント

  • grepripgrepは、ファイル全体のテキスト検索に使う主要ツールです。ripgrepは大規模なコードベースで速度向上と.gitignoreの認識機能を提供します。
  • sedはストリームベースの検索・置換操作を処理しますが、GNUバージョンとBSDバージョンで動作の違いに注意が必要です。
  • awkは、ログ、CSV、その他の構造化テキストの列指向処理に優れています。
  • jqは、JSONデータを扱う際にgrepawkでは対応できない部分を補います。
  • パイプ演算子(|)は、これらのコマンドを強力で組み合わせ可能なパイプラインに連結する接着剤です。

コア検索コマンド:grepとripgrep

grepはファイル内のパターンを検索し、一致する行を出力します。あらゆるテキスト処理パイプラインの基礎となるツールです。

# 基本的なパターン検索
grep "error" server.log

# 大文字小文字を区別しない検索
grep -i "warning" app.log

# 行番号を表示
grep -n "TODO" src/*.js

# 反転マッチ(パターンを含まない行)
grep -v "debug" output.log

# 拡張正規表現(-Eで+、?、|、グループ化が有効)
grep -E "error|warning|fatal" app.log

# マッチ数のみをカウント
grep -c "404" access.log

ripgrep (rg)は、デフォルトで.gitignoreを尊重する高速な代替ツールです:

# 再帰的検索(デフォルト動作)
rg "useState" ./src

# 特定のファイルタイプを検索
rg -t js "async function"

# マッチ周辺のコンテキストを表示
rg -C 3 "Exception" logs/

大規模なコードベースでは、ripgrepは通常grepより2〜5倍高速に動作し、無関係なファイルを自動的にスキップします。

sedによるテキスト変換

sedはストリーム編集を実行します—エディタでファイルを開かずに検索・置換操作を行います。

# 各行の最初の出現箇所を置換
sed 's/http/https/' urls.txt

# すべての出現箇所を置換(グローバルフラグ)
sed 's/old/new/g' config.txt

# パターンに一致する行を削除
sed '/^#/d' config.ini

# インプレース編集(GNU sed)
sed -i 's/localhost/127.0.0.1/g' .env

# macOS/BSDでは空のバックアップ拡張子が必要
sed -i '' 's/localhost/127.0.0.1/g' .env

注意: -iフラグの動作はGNU sedとBSD sedで異なります。macOSでは、常に空文字列(-i '')を含めるか、バックアップ拡張子(例:-i .bak)を指定してください。

awkによる列処理

awkは構造化テキスト—ログ、CSV、空白区切りデータ—の処理に優れています。POSIX awkは、ほとんどの一般的なタスクをポータブルに処理します。

# 特定の列を出力
awk '{print $1, $4}' access.log

# カスタムフィールド区切り文字(CSV)
awk -F',' '{print $2}' data.csv

# 条件によるフィルタリング
awk '$3 > 500 {print $1, $3}' response_times.log

# 列の合計
awk '{sum += $2} END {print sum}' sales.csv

# ヘッダー用のBEGIN/ENDブロック
awk 'BEGIN {print "User\tCount"} {print $1, $2}' stats.txt

必須のサポートコマンド

# ソートと重複排除(カウント付き、降順)
sort access.log | uniq -c | sort -rn

# 区切り文字による列の抽出
cut -d',' -f1,3 users.csv

# 文字変換(小文字から大文字へ)
tr '[:lower:]' '[:upper:]' < input.txt

# ファイルの行数をカウント
wc -l package.json

# 名前パターンでファイルを検索
find ./src -name "*.test.js" -type f

jqによるJSON処理

モダンなWeb開発では、**jq**がgrepawkではきれいに処理できないJSONパースを扱います:

# フィールドを抽出
jq '.data.users' response.json

# 配列要素をフィルタリング
jq '.items[] | select(.status == "active")' data.json

# APIレスポンスをフォーマット
curl -s https://api.example.com/users | jq '.[].email'

上記の最初の例は、無駄なcatの使用を避けています。jqはファイルを直接読み込めるため、cat response.json | jq '...'は不要です。

実践的なパイプライン例

今日のエラーをログからフィルタリング:

grep "$(date +%Y-%m-%d)" app.log | grep -i error | awk '{print $4, $5}'

一意のIPアドレスを抽出:

awk '{print $1}' access.log | sort -u

プロジェクト内で行数が最も多いファイルを検索:

find . -type f -name "*.js" -exec wc -l {} + | sort -rn | head -10

CSVデータのクリーニング(列の抽出、引用符の削除、重複排除):

cut -d',' -f2,4 export.csv | sed 's/"//g' | sort -u

クイックリファレンス

タスクコマンド
パターンを検索grep "pattern" file
高速な再帰的検索rg "pattern"
テキストを置換sed 's/old/new/g' file
列を抽出awk '{print $1}' file
JSONをパースjq '.key' file.json
ソートと重複排除sort -u file
行数をカウントwc -l file

まとめ

これらのLinuxテキスト処理コマンドをマスターすれば、ほとんどのログ解析、データ抽出、ファイル変換タスクをターミナルから直接処理できます。検索にはgrepから始め、列作業にはawkを追加し、JSONが関係する場合はjqを使いましょう。パイプ演算子(|)がすべてを結びつけ、小さく焦点を絞ったコマンドを、専用スクリプトに匹敵するパイプラインに組み立てることができます。

よくある質問

データに一貫した単一文字の区切り文字があり、特定のフィールドを取得するだけの場合はcutを使用します。条件による行のフィルタリング、算術演算、または不規則な空白の処理が必要な場合はawkを使用します。awkはデフォルトで連続する空白を単一の区切り文字として扱うため、ログファイルやコマンド出力に対してより寛容です。

ほとんどの開発者のワークフローでは、はい。ripgrepは高速で、.gitignoreを尊重し、再帰的検索などの適切なデフォルト設定を使用します。ただし、grepは事実上すべてのUnixシステムでデフォルトで利用可能なため、ポータブルなシェルスクリプトではより安全な選択肢です。最小限のサーバーやコンテナで実行することを想定したスクリプトを書く場合は、grepを使用してください。

常に最初に-iフラグなしでsedコマンドをテストし、ターミナルで出力をプレビューしてください。インプレース編集の準備ができたら、GNUシステムではsed -i .bakのようにバックアップ拡張子を使用します。macOSまたはBSDでは、構文はsed -i .bakです。これにより変更を適用する前に元のファイルのコピーが作成され、ロールバックオプションが得られます。

はい。jqは深くネストされた構造をナビゲートするために構築されています。オブジェクトをトラバースするにはドット表記を使用し、配列には括弧表記を使用し、パイプ式を使ってフィルタをチェーンします。例えば、jq '.data.users[] | select(.active == true) | .email'は、ネストされた配列に入り、条件でフィルタリングし、フィールドを抽出します—すべて1つのコマンドで実行します。

Gain control over your UX

See how users are using your site as if you were sitting next to them, learn and iterate faster with OpenReplay. — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay