第5章 テキスト表示と検索
設定ファイルやログの中身を確認するためのコマンドです。エディタを開かなくても、ターミナルの中でさっと内容を確認できます。
cat — ファイルの中身を丸ごと表示
$ cat memo.txt
買い物リスト
- 牛乳
- パン
- コーヒー豆
複数のファイルを指定すると、連結して表示されます: cat a.txt b.txt
| オプション | 意味 |
|---|---|
-n | すべての行に行番号を付けて表示する |
-b | 空行を除いた行にのみ行番号を付ける |
-s | 連続する空行を1行にまとめて表示する(squeeze) |
実機で cat -n memo.txt を実行すると、次のように各行の先頭に行番号が付きます。
$ cat -n memo.txt
1 買い物リスト
2 - 牛乳
3 - パン
4 - コーヒー豆
名前の由来は「concatenate(連結する)」で、本来は複数のファイルをつなげて出力するのが役割です。1つのファイルだけを指定した場合は、単に中身を表示するコマンドとしてよく使われます。ただし、ファイルサイズが大きい場合は画面がスクロールしてしまい全体を把握しづらいので、そのようなときは後述するlessやhead/tailを使うほうが適しています。
head / tail — 先頭・末尾だけ表示
ログファイルのように長いファイルを全部表示すると読みづらいので、先頭や末尾だけを見たいときに使います。既定では10行です。
| オプション | 意味 |
|---|---|
-n 行数 | 表示する行数を指定する(例: -n 5) |
-f | (tailのみ)ファイルへの追記をリアルタイムで表示し続ける。ログの監視によく使う |
$ head -n 5 access.log # 先頭5行
203.0.113.10 - - [20/Aug/2026:09:12:01 +0900] "GET /index.html HTTP/1.1" 200 1024
203.0.113.11 - - [20/Aug/2026:09:12:03 +0900] "GET /about.html HTTP/1.1" 200 843
198.51.100.7 - - [20/Aug/2026:09:12:05 +0900] "GET /favicon.ico HTTP/1.1" 404 209
203.0.113.10 - - [20/Aug/2026:09:12:08 +0900] "POST /login HTTP/1.1" 302 0
198.51.100.7 - - [20/Aug/2026:09:12:10 +0900] "GET /dashboard HTTP/1.1" 200 5231
$ tail -n 5 access.log # 末尾5行
203.0.113.15 - - [20/Aug/2026:18:44:02 +0900] "GET /api/status HTTP/1.1" 200 56
203.0.113.10 - - [20/Aug/2026:18:44:07 +0900] "GET /index.html HTTP/1.1" 200 1024
198.51.100.22 - - [20/Aug/2026:18:44:19 +0900] "GET /admin HTTP/1.1" 403 162
203.0.113.15 - - [20/Aug/2026:18:44:25 +0900] "GET /api/status HTTP/1.1" 200 56
203.0.113.10 - - [20/Aug/2026:18:44:31 +0900] "GET /logout HTTP/1.1" 302 0
$ tail -f access.log # 新しく追記された行をリアルタイムに表示し続ける
203.0.113.10 - - [20/Aug/2026:18:44:31 +0900] "GET /logout HTTP/1.1" 302 0
198.51.100.22 - - [20/Aug/2026:18:45:02 +0900] "GET / HTTP/1.1" 200 1024
(この後も新しいアクセスがあるたびに行が追記され続ける。プロンプトには戻らず、Ctrl+Cを押すまで表示が続く)
この行のこの値に注目: head/tailの出力はアクセスログの1行1リクエストの記録で、先頭は[09:12:...]と朝の時刻、末尾は[18:44:...]と夕方の時刻になっており、「先頭=古い記録」「末尾=新しい記録」という関係が読み取れます。3列目の数字(200・404・302・403)はHTTPステータスコードで、200は成功、404はページが存在しない、302はリダイレクト、403はアクセス拒否を意味します。tail -fだけはコマンドがすぐに終了せず、新しい行が書き込まれるたびに追記表示され続ける点が他の2つと異なります。
tail -fは特にサーバー運用の現場でよく使われます。アプリケーションが今まさに書き込んでいるログファイルに対して実行すると、新しい行が追記されるたびに画面に表示され続けるため、「今何が起きているか」をリアルタイムに監視できます(fは「follow」の略です)。終了するにはCtrl+Cを押します。
head と tail は組み合わせても便利です。たとえば「先頭100行のうち、末尾5行だけを見たい」といった場合は、次章で扱うパイプ(|)を使って head -n 100 access.log | tail -n 5 のようにコマンドをつなげることで実現できます。
grep — パターンで検索する
grep は、ファイルの中から指定した文字列(パターン)を含む行だけを抜き出します。
| オプション | 意味 |
|---|---|
-i | 大文字・小文字を区別しない(ignore case) |
-v | パターンに一致しない行だけを表示する(反転) |
-n | 一致した行の行番号もあわせて表示する |
-c | 一致した行の内容ではなく、件数だけを表示する |
-r | ディレクトリ内を再帰的に検索する |
$ grep コーヒー memo.txt
- コーヒー豆
$ grep -i error app.log # 大文字小文字を区別せず検索
2026-08-20 09:15:02 ERROR Failed to connect to database
2026-08-20 12:03:41 error: disk usage above threshold
2026-08-20 14:20:09 ERROR Timeout while calling external API
$ grep -c error app.log # 一致した行数だけを表示
1
$ grep -rn TODO ./src # srcディレクトリ内を再帰的に検索し、行番号も表示
./src/main.py:12:# TODO: refactor this function
./src/utils.py:5:# TODO: add unit tests
この行のこの値に注目: grep -i errorは大文字小文字を区別しないため、ERRORやerrorなど表記ゆれのある3行すべてに一致しますが、-iを付けないgrep -c errorは小文字の「error」のみに一致するため、件数は1に留まります。同じapp.logに対する検索でも、-iの有無で結果が変わる典型例です。grep -rnの出力はファイルパス:行番号:一致した行の形式で、どのファイルの何行目に一致したかが一目で分かります。
grepは単純な文字列だけでなく、簡単な正規表現(パターンマッチングのルール)も検索条件として使えます。たとえば ^ は行の先頭、$ は行の末尾を表す特別な記号で、grep "^買い物"とすれば「買い物」で始まる行だけを、grep "豆$"とすれば「豆」で終わる行だけを抜き出せます。正規表現は奥が深いテーマなので、まずはこの2つの記号だけでも覚えておくと検索の幅が広がります。
$ grep "^買い物" memo.txt
買い物リスト
$ grep "豆$" memo.txt
- コーヒー豆
grep 検索語 ファイル名の順番を逆にして、grep ファイル名 検索語のように打ってしまうミスがあります。grepは「最初に見つけた文字列扱いの引数」を検索パターンとして扱うため、順序を間違えるとエラーになったり、意図しない結果になったりします。「まずパターン、そのあとに対象ファイル」という順番を覚えておきましょう。
複数のファイルを対象にgrepを実行すると、既定でファイル名も一緒に表示されます。「どのファイルに含まれているかだけ知りたい」という場合は-l(一致したファイル名のみを表示)、逆に「一致しなかったファイルだけ知りたい」場合は-Lを使うと、大量のファイルから目的のものを素早く絞り込めます。
$ grep -l TODO *.txt # TODOという文字列を含むファイル名だけを一覧表示
project.txt
readme.txt
この行のこの値に注目: -lを付けると一致した行の中身ではなく、TODOという文字列を含んでいたファイル名だけがファイルごとに1行で列挙されます。同じディレクトリに複数の.txtファイルがあっても、一致しなかったファイル(この例ではmemo.txt)は表示されません。
wc — 行数・単語数・文字数を数える
wc(word count)は、ファイルの行数・単語数・バイト数(文字数)を数えるコマンドです。オプションなしで実行すると、この3つがまとめて表示されます。
$ wc memo.txt
4 6 32 memo.txt # 左から 行数 単語数 バイト数 ファイル名
| オプション | 意味 |
|---|---|
-l | 行数のみを表示する(lines) |
-w | 単語数のみを表示する(words) |
-c | バイト数のみを表示する(bytes) |
grep や cat の出力をパイプで wc に渡すと、「一致した行数」や「ファイルの行数」を素早く数えられます。第8章で扱うパイプと組み合わせると特に便利です。
$ grep -c error app.log # grep自身の -c オプションで件数を数える方法
1
$ grep error app.log | wc -l # grepの出力をwc -lに渡して行数を数える方法(結果は同じ)
1
この行のこの値に注目: どちらも同じapp.log(小文字の「error」を1行だけ含むファイル)に対する検索なので、結果はどちらも1で一致します。手段が違っても目的の値が同じになることを確認しておくと、パイプの仕組みへの理解が深まります。
同じ「一致した行数を知りたい」という目的でも、grepの-cオプションを使う方法と、パイプでwc -lに渡す方法の2通りがあります。前者のほうが手軽ですが、後者のように複数のコマンドを組み合わせる考え方は、Linuxの「小さな道具を組み合わせて大きな仕事をする」という思想の典型例で、第8章のパイプの章でさらに詳しく扱います。
テキストファイルとバイナリファイル
ここまで見てきた cat や grep は、人間が読める文字だけで構成された「テキストファイル」を対象にしたコマンドです。一方、画像や実行プログラムのようにテキストとして解釈できないデータは「バイナリファイル」と呼ばれます。バイナリファイルを誤って cat で表示すると、意味不明な記号が大量に出力されて画面が乱れることがあります。ファイルの種類を確認したいときは、実機であれば file ファイル名 というコマンドで判定できます。
設定ファイルやログファイル、シェルスクリプト、ソースコードなどは基本的にテキストファイルです。逆に、コンパイル済みのプログラム本体や画像・音声・動画ファイルなどはバイナリファイルにあたります。「今から自分が確認しようとしているファイルはテキストかバイナリか」を意識しておくと、うっかりcatで大きなバイナリを表示して画面が乱れる、といった失敗を避けられます。
また、テキストファイルであっても「文字コード」が想定と異なると文字化けすることがあります。現在のLinux環境ではUTF-8という文字コードが標準的に使われており、日本語を含むほとんどのファイルはこの形式で扱えば問題ありません。まれに古いシステムから受け取ったファイルがShift_JISなど別の文字コードになっていることがあり、その場合は文字化けの原因になります。文字化けに遭遇したら「コマンドや設定の間違い」より先に「文字コードの違い」を疑ってみるとよいでしょう。
less — 長いファイルをページ送りで見る
実機のターミナルでは、less ファイル名 でファイルを1画面ずつスクロールしながら閲覧できます。よく使う操作は次のとおりです。
| キー操作 | 意味 |
|---|---|
| Space | 1画面分、下にスクロール |
| b | 1画面分、上にスクロール |
| /検索語 | 下方向に文字列を検索 |
| n | 次の検索結果へ移動 |
| g | ファイルの先頭へ移動 |
| G | ファイルの末尾へ移動 |
| q | 終了 |
lessは「その場でページ送りしながら読む」ためのツールで、catのようにすべてを一度に画面へ出力しないため、数万行あるログファイルでも軽快に閲覧できます。ファイルの内容を変更する機能はないので、安全に中身を確認したいときにも向いています。
名前の由来は面白く、実はlessよりも前にmoreという似た機能のコマンドが存在していました。より高機能な後継として作られたため、「more(もっと)よりも高機能なのにless(より少ない)という名前」という、ちょっとした言葉遊びになっています。moreは前方への移動しかできませんでしたが、lessは前後どちらにも自由にスクロールできる点が大きな改善点でした。
nano — ターミナル上のテキストエディタ
ファイルの中身を書き換えたいときは、nano ファイル名 のようなテキストエディタを使います。nanoは初心者向けで、画面下部に操作方法(Ctrl+O で保存、Ctrl+X で終了、など)が常に表示されるのが特徴です。
| キー操作 | 意味 |
|---|---|
| Ctrl+O | ファイルを保存(Write Out) |
| Ctrl+X | nanoを終了 |
| Ctrl+K | 1行を切り取り |
| Ctrl+U | 切り取った行を貼り付け |
| Ctrl+W | 文字列を検索 |
サーバー管理の実務では、GUIのないLinuxサーバー上で設定ファイルを直接編集する場面が頻繁にあります。そのようなときにnanoのようなCUIエディタの基本操作を知っていると非常に役立ちます。より高機能なエディタとしてvi(vim)もよく使われますが、独特の操作体系を持つため、まずは操作方法が画面に表示されるnanoから慣れていくのがおすすめです。viの基本操作は中級編(第10章)で扱います。
cat memo.txt | grep コーヒー のように、|(パイプ)でコマンドをつなぐと、cat の出力を grep で絞り込めます。パイプについては第8章で詳しく扱います。
目的別コマンドの選び方の整理
本章で登場したコマンドは似た用途に見えますが、「ファイルの規模」で選び分けると迷いにくくなります。数行程度の短いファイルはcatで全体を一気に見て構いませんが、ログファイルのように数千行を超えるものはcatではなくlessで開き、必要な範囲だけ検索しながら読むのが基本です。「直近の状況だけ知りたい」ときはtail、「特定のキーワードを含む行だけ知りたい」ときはgrepというように、目的を先に決めてからコマンドを選ぶ習慣をつけると、無駄なく調査を進められるようになります。
手を動かす小課題
練習用ターミナルで、次の課題を実際に試してみましょう。答えは見出しをクリックすると表示されます。
課題1: cat memo.txtで中身を確認したあと、wc -l memo.txtで行数を数えてみましょう。
答え: cat memo.txtでファイル全体を表示し、wc -l memo.txtでその行数を数値だけで確認します。「中身をざっと見る」のと「量を把握する」のとでは使うコマンドが違う、という感覚をつかんでみましょう。
課題2: cat memo.txt | grep コーヒーのように、パイプでcatとgrepをつないでみましょう。
答え: cat memo.txt | grep キーワードと入力すると、memo.txtの中から指定した文字列を含む行だけが表示されます。パイプの詳しい仕組みは第8章で扱います。
課題3: headとtailで、ファイルの先頭と末尾だけを見比べてみましょう。
答え: head memo.txtで先頭部分、tail memo.txtで末尾部分だけが表示されます。ログファイルのように長いファイルを調査するとき、まずこの2つで全体の様子をつかむのが定石です。
この章のまとめ
cat・head・tail・grep・wc・less・nanoと、この章では多くのコマンドが登場しました。それぞれ「全体を見る」「先頭/末尾だけ見る」「条件で絞り込む」「数える」「快適に閲覧する」「編集する」という異なる役割を持っています。最初はどれも似たようなものに見えるかもしれませんが、ログファイルの調査やトラブルシューティングの現場では、これらを目的に応じて使い分けられるかどうかが作業スピードを大きく左右します。次章ではいよいよ、ファイルやディレクトリへのアクセス権限を管理する「パーミッション」を学びます。