Linuxテキスト処理コマンド解説

テキスト処理コマンド

テキストファイルの表示、検索、編集、加工などを行うコマンドです。

cat - ファイルの内容表示・連結

ファイルの内容を表示したり、複数のファイルを連結したりします。

オプション 説明
-n 行番号を表示
-b 空行以外の行に行番号を表示
-s 連続する空行を1行にまとめる
-A 制御文字や特殊文字を表示(タブ、改行など)

例:

cat file.txt - ファイルの内容を表示
cat file1.txt file2.txt - 複数のファイルの内容を連結して表示
cat file1.txt file2.txt > combined.txt - 複数のファイルを連結して新しいファイルに保存

grep - テキスト検索

ファイル内のテキストパターンを検索します。

オプション 説明
-i 大文字と小文字を区別しない
-v パターンに一致しない行を表示
-n 行番号を表示
-r, -R ディレクトリ内のファイルを再帰的に検索
-l パターンを含むファイル名のみを表示
-c パターンに一致する行数を表示
-E 拡張正規表現を使用
-A n 一致した行の後 n 行を表示
-B n 一致した行の前 n 行を表示
-C n 一致した行の前後 n 行を表示

例:

grep "pattern" file.txt - ファイル内でパターンに一致する行を検索
grep -i "pattern" file.txt - 大文字小文字を区別せずに検索
grep -r "pattern" directory/ - ディレクトリ内のすべてのファイルから再帰的に検索
grep -E "pattern1|pattern2" file.txt - 複数のパターンのいずれかに一致する行を検索
grep -v "^#" config.txt | grep -v "^$" - コメント行と空行を除外(パイプを使用)
ps aux | grep "[f]irefox" - grepプロセス自体を除外してfirefoxプロセスを検索
grep -A 2 -B 1 "ERROR" log.txt - エラー行とその前後の行を表示
grep -o "([0-9]\{1,3\}\.){3}[0-9]\{1,3\}" file.txt - IPアドレスのみを抽出
find . -name "*.log" -exec grep -l "ERROR" {} \; | xargs wc -l - エラーを含むログファイルの行数をカウント
history | grep "git commit" | sed 's/^[ 0-9]*//' - コミット履歴のコマンドのみを抽出

sed - ストリームエディタ

テキストの置換、削除、挿入などの編集を行います。

オプション/構文 説明
-i ファイルを直接編集(デフォルトでは標準出力に出力)
-e 複数のコマンドを指定
-n 自動出力を抑制(特定のパターンに一致する行のみ出力)
s/pattern/replacement/ パターンを置換
s/pattern/replacement/g パターンをすべて置換(gはグローバルの意味)
d パターンに一致する行を削除
p パターンに一致する行を出力(通常は-nと共に使用)

例:

sed 's/old/new/' file.txt - 各行の最初の「old」を「new」に置換
sed 's/old/new/g' file.txt - 各行のすべての「old」を「new」に置換
sed -i 's/old/new/g' file.txt - ファイルを直接編集して置換
sed '/pattern/d' file.txt - パターンに一致する行を削除
sed -n '/pattern/p' file.txt - パターンに一致する行のみを表示
sed -i.bak 's/old/new/g' file.txt - 元ファイルをバックアップしてから編集
sed '1,5s/old/new/g' file.txt - 1行目から5行目までの「old」を「new」に置換
sed '/start/,/end/d' file.txt - 「start」から「end」までのパターンに一致する行の範囲を削除
sed 's/[0-9]\{3\}-[0-9]\{4\}/XXX-XXXX/g' file.txt - 電話番号形式のテキストをマスク
cat file.txt | sed 's/^[ \t]*//' - 各行の先頭の空白を削除(パイプを使用)
echo "hello world" | sed 's/\b\(.\)/\u\1/g' - 各単語の先頭を大文字に変換
sed -e 's/old/new/g' -e 's/foo/bar/g' file.txt - 複数の置換を一度に実行
grep "ERROR" log.txt | sed 's/.*ERROR: \(.*\)/\1/' - エラーメッセージのみを抽出

awk - テキスト処理言語

テキストデータの加工や分析を行うためのプログラミング言語です。

構文/パターン 説明
'{print $1}' 各行の1番目のフィールド(列)を出力
'{print $1, $3}' 各行の1番目と3番目のフィールドを出力
-F フィールド区切り文字を指定(デフォルトは空白)
'/pattern/ {action}' パターンに一致する行に対してアクションを実行
NR 現在の行番号
NF 現在の行のフィールド数

例:

awk '{print $1}' file.txt - 各行の1番目のフィールドを出力
awk -F, '{print $1, $3}' file.csv - CSVファイルの1番目と3番目のフィールドを出力
awk '/pattern/ {print $0}' file.txt - パターンに一致する行を出力
awk '{sum += $1} END {print sum}' file.txt - 1番目のフィールドの合計を計算して出力
awk '{count[$1]++} END {for (word in count) print word, count[word]}' file.txt - 各単語の出現回数をカウント
awk -F, '{if ($3 > 100) print $1, $2, $3}' data.csv - 条件に一致する行のみを出力
awk 'NR % 2 == 0' file.txt - 偶数行のみを出力
awk 'length($0) > 80' file.txt - 80文字より長い行を出力
awk 'BEGIN {FS=","; OFS="\t"} {print $1, $2, $3}' file.csv - CSVをTSVに変換
ps aux | awk '$3 > 10.0 {print $2, $3, $11}' - CPU使用率が10%を超えるプロセスを表示
cat /etc/passwd | awk -F: '{print "User: " $1 ", Home: " $6}' - ユーザー情報を整形して表示
ls -l | awk '{sum += $5} END {printf "Total size: %.2f MB\n", sum/1024/1024}' - ディレクトリ内のファイルサイズ合計をMB単位で表示
grep "ERROR" log.txt | awk -F: '{print $1}' | sort | uniq -c - エラーが発生したファイルとその回数を表示

head/tail - ファイルの先頭/末尾部分の表示

ファイルの先頭または末尾の一部を表示します。

コマンド/オプション 説明
head file.txt ファイルの先頭10行を表示
head -n N file.txt ファイルの先頭N行を表示
tail file.txt ファイルの末尾10行を表示
tail -n N file.txt ファイルの末尾N行を表示
tail -f file.txt ファイルの末尾を表示し、追加されるデータをリアルタイムに表示(ログ監視などに便利)

例:

head -n 5 file.txt - ファイルの先頭5行を表示
tail -n 20 file.txt - ファイルの末尾20行を表示
tail -f /var/log/syslog - システムログをリアルタイムに監視
head -n 5 file.txt | tail -n 1 - ファイルの5行目のみを表示
tail -n +10 file.txt | head -n 5 - 10行目から5行分を表示
ls -l | head -n 5 - ディレクトリ内の最初の5つのファイルを表示
find . -type f -name "*.log" | head - 最初の10個のログファイルを表示
ps aux | sort -nrk 3,3 | head -n 5 - CPU使用率の高い上位5つのプロセスを表示
tail -f log.txt | grep --color "ERROR" - エラーメッセージをハイライト表示しながらログを監視
tail -f /var/log/apache2/access.log /var/log/apache2/error.log - 複数のログファイルを同時に監視
find . -type f -mtime -1 | xargs wc -l | head - 過去24時間以内に変更されたファイルの行数上位10件を表示

sort - テキストのソート

テキストファイルの行をソートします。

オプション 説明
-r 逆順(降順)でソート
-n 数値としてソート
-k N N番目のフィールド(列)でソート
-t フィールド区切り文字を指定
-u 重複行を削除(ユニークな行のみ出力)
-f 大文字小文字を区別せずにソート

例:

sort file.txt - ファイルの内容をアルファベット順にソート
sort -r file.txt - 逆順でソート
sort -n numbers.txt - 数値としてソート
sort -k 2 -t, file.csv - CSVファイルの2番目のフィールドでソート
sort -k 2n -t: file.txt - 2番目のフィールドを数値としてソート(区切り文字は:)
sort -k 3,3 -k 1,1 file.txt - 3列目でソートし、同じ値は1列目でソート
sort -u file.txt - ソートして重複行を削除
sort -h sizes.txt - 人間が読みやすい形式(K, M, G)でソート
du -h | sort -hr - ディレクトリサイズを大きい順にソート
ps aux | sort -nrk 3,3 | head -n 10 - CPU使用率の高い順に上位10プロセスを表示
cat /etc/passwd | sort -t: -k 3 -n - ユーザーをUID順にソート
find . -type f -name "*.log" | xargs ls -l | sort -k 5 -nr - ログファイルをサイズ順にソート

uniq - 重複行の処理

連続する重複行を処理します(通常はsortと組み合わせて使用)。

オプション 説明
-c 出現回数を表示
-d 重複する行のみを表示
-u 重複しない行のみを表示
-i 大文字小文字を区別せずに比較

例:

sort file.txt | uniq - ソートしてから重複行を削除
sort file.txt | uniq -c - 各行の出現回数を表示
sort file.txt | uniq -d - 重複する行のみを表示
sort file.txt | uniq -u - 重複しない行のみを表示
sort file.txt | uniq -c | sort -nr - 出現頻度の高い順に表示
cat access.log | cut -d' ' -f1 | sort | uniq -c | sort -nr - IPアドレスのアクセス頻度を集計
cat file.txt | tr '[:upper:]' '[:lower:]' | sort | uniq - 大文字小文字を区別せずに重複を削除
history | cut -c8- | sort | uniq -c | sort -nr | head -n 10 - 最もよく使うコマンド上位10個を表示
find . -type f -name "*.txt" | xargs cat | sort | uniq -c - 全テキストファイル内の行の出現回数を集計
grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' access.log | sort | uniq -c | sort -nr - ログファイル内のIPアドレスの出現頻度を集計

wc - 行数・単語数・バイト数のカウント

ファイルの行数、単語数、バイト数をカウントします。

オプション 説明
-l 行数のみをカウント
-w 単語数のみをカウント
-c バイト数のみをカウント
-m 文字数のみをカウント

例:

wc file.txt - ファイルの行数、単語数、バイト数を表示
wc -l file.txt - ファイルの行数のみを表示
wc -w file.txt - ファイルの単語数のみを表示
wc -c file.txt - ファイルのバイト数のみを表示
wc -m file.txt - ファイルの文字数を表示(マルチバイト文字を正しくカウント)
find . -name "*.py" | xargs wc -l - すべてのPythonファイルの行数を表示
find . -name "*.py" | xargs wc -l | sort -nr - Pythonファイルを行数の多い順にソート
grep -v "^#" script.sh | grep -v "^$" | wc -l - コメントと空行を除いたスクリプトの実行行数
cat file.txt | tr -s ' ' '\n' | sort | uniq | wc -l - ファイル内のユニークな単語数をカウント
ls -la | wc -l - ディレクトリ内のファイル数をカウント(ヘッダー行を含む)
for file in *.txt; do echo -n "$file: "; wc -l < "$file"; done - 各テキストファイルの行数を表示
find . -type f -exec cat {} \; | wc -l - ディレクトリ内のすべてのファイルの合計行数