はじめに

Linuxでの作業において、ファイルの内容を素早く確認したり、必要な情報を検索したりする能力は不可欠です。GUIのテキストエディタでファイルを開くこともできますが、コマンドラインツールを使いこなすことで、はるかに効率的にファイル操作を行えます。

本記事では、ファイル内容の表示コマンド(cat、less、more)、部分表示コマンド(head、tail)、ファイル検索コマンド(find、locate)、テキスト検索コマンド(grep)、そしてこれらを強力に連携させるリダイレクトとパイプの基本を体系的に解説します。

これらのコマンドを習得することで、設定ファイルの確認、ログファイルの監視、特定パターンの検索など、日常的なLinux作業を大幅に効率化できます。

動作確認環境

本記事のコマンドは以下の環境で動作確認しています。

項目 内容
OS Ubuntu 24.04 LTS
シェル bash 5.3
カーネル Linux 6.8
coreutils 9.4
grep 3.11

WSL2やVirtualBox上のLinux環境、その他の主要ディストリビューション(AlmaLinux、Debian等)でも同様に動作します。

ファイル内容の表示

catコマンド - ファイル全体を表示

cat(concatenate)は、ファイルの内容を標準出力に表示する最も基本的なコマンドです。短いファイルの内容を素早く確認したい場合に適しています。

1
2
3
4
5
6
7
8
# ファイルの内容を表示
cat /etc/hostname

# 複数ファイルを連結して表示
cat file1.txt file2.txt

# 行番号を付けて表示
cat -n script.sh

catコマンドの主要オプション

オプション 説明
-n すべての行に行番号を付ける
-b 空行以外に行番号を付ける
-s 連続する空行を1行にまとめる
-A 制御文字を可視化(タブは^I、行末は$)
-E 行末に$を表示
-T タブ文字を^Iで表示
1
2
3
4
5
# 空行を圧縮して行番号付きで表示
cat -sn config.txt

# タブと行末を可視化(フォーマット確認に便利)
cat -A Makefile
graph LR
    A[cat file.txt] --> B[ファイル読み込み]
    B --> C[標準出力]
    C --> D[ターミナル表示]

catは小さなファイルの確認には便利ですが、大きなファイルでは画面がスクロールしてしまい、内容を確認しづらくなります。そのような場合は、次に紹介するlessやmoreを使用します。

lessコマンド - ページ単位で閲覧

lessは、ファイルを1画面ずつ表示するページャです。大きなファイルでも全体をメモリに読み込まず、必要な部分だけを読み込むため効率的です。「less is more」という格言のとおり、moreコマンドの改良版として開発されました。

1
2
3
4
5
6
7
8
# ファイルをlessで開く
less /var/log/syslog

# 行番号を表示
less -N /etc/passwd

# 検索パターンをハイライト
less -p "error" /var/log/syslog

lessの操作キー

lessを起動したら、以下のキーで操作します。

キー 動作
Space / f 1画面進む
b 1画面戻る
j / Enter 1行進む
k 1行戻る
g ファイル先頭へ移動
G ファイル末尾へ移動
/パターン 前方検索
?パターン 後方検索
n 次の検索結果へ
N 前の検索結果へ
q 終了
h ヘルプ表示
1
2
3
# 複数ファイルを順番に閲覧
less file1.txt file2.txt file3.txt
# :n で次のファイル、:p で前のファイルに移動

lessの便利なオプション

オプション 説明
-N 行番号を表示
-S 長い行を折り返さない(横スクロール可能)
-i 検索で大文字小文字を区別しない
-R ANSIエスケープシーケンスを解釈(カラー表示)
+F tail -fのようにファイル末尾を追跡
1
2
3
4
5
# ログファイルをリアルタイム監視(Ctrl+Cで停止、qで終了)
less +F /var/log/syslog

# カラー出力をそのまま表示
ls --color=always | less -R

moreコマンド - シンプルなページャ

moreはlessの前身となるページャで、基本的な閲覧機能を提供します。lessよりも機能は限られますが、ほぼすべてのUnix系システムで利用可能です。

1
2
3
4
5
# ファイルをmoreで開く
more /etc/services

# 表示開始行を指定
more +100 /etc/services

moreはlessと異なり、後方へのスクロールができません(一部の実装では可能)。現代のLinux環境では、より高機能なlessの使用を推奨します。

ファイルの部分表示

headコマンド - ファイルの先頭を表示

headは、ファイルの先頭部分を表示します。デフォルトでは先頭10行を表示します。設定ファイルのヘッダー確認やログファイルの冒頭チェックに便利です。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 先頭10行を表示(デフォルト)
head /etc/passwd

# 先頭20行を表示
head -n 20 /etc/passwd
# または
head -20 /etc/passwd

# 先頭100バイトを表示
head -c 100 /etc/passwd

headコマンドの主要オプション

オプション 説明
-n 数値 先頭から指定行数を表示
-n -数値 末尾の指定行を除いて表示
-c 数値 先頭から指定バイト数を表示
-q 複数ファイル時にヘッダーを表示しない
-v 常にファイル名のヘッダーを表示
1
2
3
4
5
# 末尾5行を除いた内容を表示
head -n -5 data.txt

# 複数ファイルの先頭を確認
head -n 5 *.log

tailコマンド - ファイルの末尾を表示

tailは、ファイルの末尾部分を表示します。デフォルトでは末尾10行を表示します。ログファイルの最新エントリを確認する際に特に重宝します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 末尾10行を表示(デフォルト)
tail /var/log/syslog

# 末尾50行を表示
tail -n 50 /var/log/syslog
# または
tail -50 /var/log/syslog

# 末尾100バイトを表示
tail -c 100 /var/log/syslog

tailコマンドの主要オプション

オプション 説明
-n 数値 末尾から指定行数を表示
-n +数値 指定行目から末尾まで表示
-c 数値 末尾から指定バイト数を表示
-f ファイルの追記をリアルタイムで監視
-F ファイルのローテーションに追従して監視
–pid=PID 指定プロセス終了時に監視を終了
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 11行目から末尾まで表示(ヘッダーをスキップ)
tail -n +11 data.csv

# ログファイルをリアルタイム監視
tail -f /var/log/nginx/access.log

# ログローテーション対応の監視
tail -F /var/log/syslog

# 複数ファイルを同時監視
tail -f /var/log/nginx/access.log /var/log/nginx/error.log

リアルタイム監視(tail -f)

tail -fはログ監視の定番コマンドです。新しいログが追記されるたびにリアルタイムで表示されます。

1
2
3
4
# アクセスログを監視
tail -f /var/log/nginx/access.log

# 終了するにはCtrl+Cを押す
sequenceDiagram
    participant User as ユーザー
    participant Tail as tail -f
    participant Log as ログファイル
    
    User->>Tail: tail -f 実行
    loop ファイル監視
        Log->>Tail: 新しいログ追記
        Tail->>User: 新しい内容を表示
    end
    User->>Tail: Ctrl+C
    Tail->>User: 終了

headとtailの組み合わせ

headとtailを組み合わせることで、ファイルの特定範囲を抽出できます。

1
2
3
4
5
6
7
# 100行目から110行目を表示
head -n 110 file.txt | tail -n 11

# 50行目だけを表示
sed -n '50p' file.txt
# または
head -n 50 file.txt | tail -n 1

ファイル検索

findコマンド - ファイルを条件で検索

findは、ディレクトリ階層を再帰的に検索し、条件に一致するファイルを見つけるコマンドです。名前、種類、サイズ、更新日時など、様々な条件で検索できます。

1
2
3
4
5
6
7
8
# 基本構文
find 検索開始パス [検索条件] [アクション]

# カレントディレクトリ以下で.txtファイルを検索
find . -name "*.txt"

# /homeディレクトリ以下で.logファイルを検索
find /home -name "*.log"

findの主要な検索条件

条件 説明
-name パターン ファイル名で検索(大文字小文字区別)
-iname パターン ファイル名で検索(大文字小文字区別なし)
-type f 通常ファイルのみ
-type d ディレクトリのみ
-type l シンボリックリンクのみ
-size +10M 10MBより大きいファイル
-size -1k 1KB未満のファイル
-mtime -7 7日以内に変更されたファイル
-mtime +30 30日より前に変更されたファイル
-user ユーザー名 指定ユーザーが所有者のファイル
-perm 権限 指定パーミッションのファイル
-empty 空のファイルまたはディレクトリ
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 7日以内に更新された設定ファイルを検索
find /etc -name "*.conf" -mtime -7

# 100MBを超えるファイルを検索
find /var -type f -size +100M

# 空のディレクトリを検索
find . -type d -empty

# 実行権限を持つファイルを検索
find /usr/local/bin -type f -perm -u+x

findのアクション

アクション 説明
-print ファイルパスを表示(デフォルト)
-ls ls -l形式で詳細表示
-delete マッチしたファイルを削除
-exec コマンド {} ; 各ファイルに対してコマンドを実行
-exec コマンド {} + まとめてコマンドに渡す(効率的)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 検索結果の詳細を表示
find /var/log -name "*.log" -ls

# 古いログファイルを削除
find /var/log -name "*.log" -mtime +90 -delete

# 検索したファイルの権限を変更
find . -type f -name "*.sh" -exec chmod +x {} \;

# 検索したファイルの内容をgrepで検索
find . -name "*.py" -exec grep -l "import os" {} \;

複数条件の組み合わせ

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# AND条件(-a または条件を並べる)
find . -name "*.txt" -size +1M

# OR条件(-o)
find . -name "*.jpg" -o -name "*.png"

# NOT条件(!または-not)
find . -type f ! -name "*.bak"

# グループ化(エスケープが必要)
find . \( -name "*.jpg" -o -name "*.png" \) -size +1M

locateコマンド - データベースで高速検索

locateは、事前に構築されたデータベースを使用してファイルを検索します。findよりも圧倒的に高速ですが、データベースが最新でない場合は新しいファイルが見つからないことがあります。

1
2
3
4
5
6
7
8
# パターンに一致するファイルを検索
locate nginx.conf

# 大文字小文字を区別しない検索
locate -i README

# データベースを更新(root権限が必要)
sudo updatedb

locateの主要オプション

オプション 説明
-i 大文字小文字を区別しない
-c マッチ数だけを表示
-l 数値 結果の最大表示数
-r パターン 正規表現で検索
1
2
3
4
5
6
7
8
# 最初の10件だけ表示
locate -l 10 python

# マッチしたファイルの数を表示
locate -c "*.py"

# 正規表現で検索
locate -r "nginx.*\.conf$"

locateを利用するには、mlocateパッケージのインストールが必要な場合があります。

1
2
3
4
5
# Ubuntu/Debian
sudo apt install mlocate

# RHEL/CentOS/AlmaLinux
sudo dnf install mlocate

findとlocateの使い分け

特性 find locate
速度 遅い(ファイルシステムを走査) 高速(データベース検索)
検索条件 多彩(サイズ、日時、権限など) ファイル名パターンのみ
最新性 常に最新 データベース更新が必要
用途 詳細な条件検索、アクション実行 ファイル名の素早い検索

テキスト検索 - grepコマンド

grepの基本

grep(Global Regular Expression Print)は、ファイルやテキストストリームから特定のパターンに一致する行を検索・抽出するコマンドです。ログ解析、設定確認、ソースコード検索など、あらゆる場面で活躍します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 基本構文
grep [オプション] パターン [ファイル...]

# ファイル内で"error"を含む行を検索
grep "error" /var/log/syslog

# 複数ファイルを検索
grep "TODO" *.py

# 大文字小文字を区別せずに検索
grep -i "error" /var/log/syslog

grepの主要オプション

マッチング制御

オプション 説明
-i 大文字小文字を区別しない
-v パターンにマッチしない行を表示
-w 単語全体としてマッチ
-x 行全体としてマッチ
-e パターン 複数パターンを指定
-f ファイル パターンをファイルから読み込む
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 大文字小文字を区別しない検索
grep -i "warning" /var/log/syslog

# マッチしない行を表示(除外フィルタ)
grep -v "DEBUG" app.log

# 単語として"the"を検索("then"や"there"はマッチしない)
grep -w "the" document.txt

# 複数パターンのOR検索
grep -e "error" -e "warning" /var/log/syslog

出力制御

オプション 説明
-n 行番号を表示
-c マッチした行数を表示
-l マッチしたファイル名のみ表示
-L マッチしなかったファイル名を表示
-o マッチした部分のみ表示
-H ファイル名を常に表示
-h ファイル名を表示しない
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 行番号付きで表示
grep -n "function" script.py

# マッチした行数をカウント
grep -c "error" /var/log/syslog

# エラーを含むファイル名だけをリスト
grep -l "error" /var/log/*.log

# マッチした部分だけを抽出
grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+" access.log

コンテキスト表示

オプション 説明
-A 数値 マッチ行の後に指定行数を表示
-B 数値 マッチ行の前に指定行数を表示
-C 数値 マッチ行の前後に指定行数を表示
1
2
3
4
5
6
7
8
# マッチ行とその後の3行を表示
grep -A 3 "Exception" error.log

# マッチ行とその前の2行を表示
grep -B 2 "FATAL" error.log

# マッチ行の前後5行を表示
grep -C 5 "segfault" /var/log/syslog

再帰検索

オプション 説明
-r ディレクトリを再帰的に検索
-R シンボリックリンクも辿って再帰検索
–include=パターン 検索対象ファイルを指定
–exclude=パターン 検索から除外するファイルを指定
–exclude-dir=パターン 検索から除外するディレクトリを指定
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# カレントディレクトリ以下を再帰検索
grep -r "TODO" .

# Pythonファイルのみを検索
grep -r --include="*.py" "import" .

# node_modulesを除外して検索
grep -r --exclude-dir="node_modules" "console.log" .

# 複数のパターンを除外
grep -r --exclude-dir={node_modules,dist,build} "function" .

正規表現の基本

grepは強力な正規表現をサポートしています。デフォルトでは基本正規表現(BRE)が使用されます。

基本正規表現(BRE)のメタ文字

メタ文字 意味
. 任意の1文字
* 直前の文字の0回以上の繰り返し
^ 行頭
$ 行末
[abc] a、b、cのいずれか1文字
[^abc] a、b、c以外の1文字
[a-z] aからzまでの1文字
< 単語の先頭
> 単語の末尾
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 行頭が#で始まるコメント行を検索
grep "^#" config.conf

# 行末が:で終わる行を検索
grep ":$" /etc/passwd

# IPアドレスパターンを検索
grep "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+" access.log

# 空行を検索
grep "^$" file.txt

拡張正規表現(-E または egrep)

-Eオプションで拡張正規表現(ERE)を使用すると、より多くのメタ文字が利用可能になります。

メタ文字 意味
+ 直前の文字の1回以上の繰り返し
? 直前の文字の0回または1回
{n} 直前の文字のn回の繰り返し
{n,m} 直前の文字のn回以上m回以下の繰り返し
| OR(選択)
() グループ化
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 拡張正規表現を使用
grep -E "error|warning|critical" /var/log/syslog

# 電話番号パターン(080, 090で始まる)
grep -E "^0[89]0-[0-9]{4}-[0-9]{4}$" contacts.txt

# メールアドレスパターン
grep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" emails.txt

# HTTPステータスコード(4xxまたは5xx)
grep -E "HTTP/[0-9.]+ [45][0-9]{2}" access.log

grepの実践例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# Apacheアクセスログから404エラーを抽出
grep " 404 " /var/log/apache2/access.log

# 特定IPアドレスからのアクセスを検索
grep "^192\.168\.1\.100" /var/log/apache2/access.log

# 認証失敗のログを検索
grep -i "authentication failure" /var/log/auth.log

# プロセスリストから特定のプロセスを検索(grep自身を除外)
ps aux | grep "[n]ginx"

# 設定ファイルからコメント行と空行を除外して表示
grep -v "^#" config.conf | grep -v "^$"

# 特定のパターンを含むファイル数をカウント
grep -r -l "deprecated" src/ | wc -l

リダイレクトとパイプ

標準入出力の概念

Linuxのプロセスには3つの標準ストリームがあります。

ストリーム 説明 ファイル記述子
標準入力(stdin) プログラムへの入力 0
標準出力(stdout) プログラムからの通常出力 1
標準エラー出力(stderr) プログラムからのエラー出力 2
graph LR
    A[標準入力<br>stdin: 0] --> B[コマンド]
    B --> C[標準出力<br>stdout: 1]
    B --> D[標準エラー出力<br>stderr: 2]

リダイレクト - 入出力先の変更

リダイレクトを使用すると、コマンドの入出力先をファイルに変更できます。

出力リダイレクト

演算子 説明
> 標準出力をファイルに書き込み(上書き)
» 標準出力をファイルに追記
2> 標準エラー出力をファイルに書き込み
標準エラー出力をファイルに追記
&> 標準出力と標準エラー出力を同じファイルに
2>&1 標準エラー出力を標準出力にマージ
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# コマンド出力をファイルに保存(上書き)
ls -la > filelist.txt

# コマンド出力をファイルに追記
echo "New entry" >> log.txt

# エラー出力をファイルに保存
find / -name "*.conf" 2> errors.txt

# 標準出力と標準エラー出力を別々のファイルに
command > output.txt 2> errors.txt

# 標準出力と標準エラー出力を同じファイルに
command > all_output.txt 2>&1
# または(bash 4.0以降)
command &> all_output.txt

# エラーを破棄(/dev/nullに捨てる)
find / -name "*.conf" 2>/dev/null

入力リダイレクト

演算子 説明
< ファイルから標準入力を読み込み
« ヒアドキュメント(複数行の入力)
«< ヒアストリング(文字列を入力)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# ファイルから入力
sort < unsorted.txt

# ヒアドキュメント
cat << EOF > config.txt
server=localhost
port=8080
debug=true
EOF

# ヒアストリング
grep "pattern" <<< "This is a pattern test"

パイプ - コマンドの連結

パイプ(|)は、あるコマンドの標準出力を別のコマンドの標準入力に接続します。複数のコマンドを組み合わせて、複雑なデータ処理を実現できます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 基本的なパイプ
ls -la | less

# ファイル一覧から".log"ファイルだけを抽出
ls -la | grep "\.log$"

# プロセスの数をカウント
ps aux | wc -l

# ディスク使用量の多い順にソート
du -sh * | sort -rh | head -10
graph LR
    A[コマンド1] -->|stdout| B[パイプ]
    B -->|stdin| C[コマンド2]
    C -->|stdout| D[パイプ]
    D -->|stdin| E[コマンド3]

パイプラインの実践例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# アクセスログから上位10のIPアドレスを集計
cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn | head -10

# 実行中のプロセスをメモリ使用量順に表示
ps aux | sort -k 4 -rn | head -10

# ファイル内の単語出現頻度を集計
cat document.txt | tr -s ' ' '\n' | sort | uniq -c | sort -rn | head -20

# CSVファイルから特定の列を抽出してソート
cat data.csv | cut -d',' -f2 | sort -u

# ログファイルから特定時間帯のエラーを抽出
cat /var/log/syslog | grep "Jan  7 1[0-2]:" | grep -i error

# 大きなファイルトップ10を検索
find / -type f -size +100M 2>/dev/null | head -10

teeコマンド - 出力の分岐

teeコマンドは、標準入力を標準出力とファイルの両方に出力します。パイプラインの途中でデータを保存しつつ、次のコマンドに渡すことができます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 出力を画面表示しながらファイルにも保存
ls -la | tee filelist.txt

# 複数ファイルに同時に出力
echo "Log entry" | tee file1.txt file2.txt

# ファイルに追記
echo "New log" | tee -a log.txt

# パイプラインの途中でデータを保存
cat access.log | grep "error" | tee errors.txt | wc -l
graph LR
    A[コマンド] --> B[tee]
    B --> C[標準出力]
    B --> D[ファイル]

xargsコマンド - 引数への変換

xargsは、標準入力から受け取ったデータを、別のコマンドの引数として渡します。パイプラインで受け取った結果を、引数として受け付けるコマンドに渡す際に使用します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 検索結果のファイルを削除
find /tmp -name "*.tmp" | xargs rm

# ファイル名にスペースが含まれる場合の安全な処理
find . -name "*.txt" -print0 | xargs -0 cat

# 並列実行(4プロセス)
find . -name "*.jpg" | xargs -P 4 -I {} convert {} -resize 50% resized_{}

# 検索結果を1つずつ処理
find . -name "*.log" | xargs -I {} grep -l "error" {}

実践的な活用例

ログ監視とトラブルシューティング

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# Nginxエラーログをリアルタイム監視しながらerrorをハイライト
tail -f /var/log/nginx/error.log | grep --color=always -i error

# 特定時間帯のアクセスログを分析
cat /var/log/nginx/access.log | grep "07/Jan/2026:1[0-5]:" | grep -v "200 " | less

# 認証失敗のIPアドレスを抽出
grep "Failed password" /var/log/auth.log | grep -oE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" | sort | uniq -c | sort -rn

# 直近1時間のエラー件数
grep "$(date '+%b %e %H')" /var/log/syslog | grep -ci error

設定ファイルの確認

1
2
3
4
5
6
7
8
# コメントと空行を除外して有効な設定だけを表示
grep -vE "^#|^$|^[[:space:]]*#" /etc/nginx/nginx.conf

# 設定ファイル内の特定設定を検索
find /etc -name "*.conf" -exec grep -l "max_connections" {} \; 2>/dev/null

# 設定値の比較
diff <(grep -v "^#" file1.conf | sort) <(grep -v "^#" file2.conf | sort)

ソースコード検索

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 関数定義を検索
grep -rn "def " --include="*.py" .

# TODOコメントを検索
grep -rn "TODO\|FIXME\|XXX" --include="*.js" --exclude-dir=node_modules .

# 特定のimport文を含むファイルを検索
grep -rl "import pandas" --include="*.py" .

# 未使用の変数候補を検索(定義はあるが使用箇所が1件のみ)
for var in $(grep -ohE "\b[a-z_][a-z0-9_]*\b" *.py | sort -u); do
  count=$(grep -c "\b$var\b" *.py)
  [ "$count" -eq 1 ] && echo "$var"
done

まとめ

本記事では、Linuxでファイル内容を効率的に閲覧・検索するための基本コマンドを解説しました。

コマンド 用途
cat ファイル全体を表示、ファイル連結
less 大きなファイルをページ単位で閲覧
more シンプルなページャ
head ファイルの先頭部分を表示
tail ファイルの末尾部分を表示、リアルタイム監視
find ディレクトリを再帰的に検索
locate データベースで高速ファイル検索
grep テキストパターン検索
tee 出力の分岐
xargs 標準入力を引数に変換

これらのコマンドをリダイレクトとパイプで組み合わせることで、複雑なテキスト処理やログ解析も効率的に行えます。日常的な作業で積極的に使用し、コマンドを手に馴染ませていくことが上達への近道です。

参考リンク