LPIC Level1 復習ラジオ 10:ファイル閲覧コマンド
音声
目次
閲覧コマンドの使い分け
ファイルの内容を確認するコマンドは、確認したい範囲やファイルの大きさによって使い分けます。
| コマンド | 主な用途 |
|---|---|
cat |
短いファイルを一度に表示する、複数ファイルを連結する |
less |
長いファイルをページ単位で移動・検索しながら読む |
head |
ファイルの先頭部分を表示する |
tail |
ファイルの末尾部分を表示し、追記を継続監視する |
wc |
行数、単語数、バイト数、文字数などを数える |
短い設定ファイルならcat、長いログならless、冒頭だけならhead、最新部分ならtail、件数だけならwcという整理が基本です。
標準入力と標準出力
今回のコマンドは、ファイル名を指定した場合はそのファイルを読み、ファイル名を指定しない場合は標準入力を読むものが中心です。
cat file.txt
cat
printf '%s\n' alpha beta | head -n 1
grep ERROR app.log | wc -l
catだけを実行すると、キーボードからの入力を標準入力として読み、そのまま標準出力へ表示します。入力を終えるには、一般的な端末では行頭でCtrl+Dを押してEOFを送ります。
パイプ|は、左側コマンドの標準出力を、右側コマンドの標準入力へ渡します。
command1 | command2
この仕組みにより、「抽出してから数える」「末尾だけをページャーで読む」といった組み合わせができます。
ファイル名としてのハイフン
GNU Coreutilsの多くのコマンドでは、ファイル名の位置へ-を指定すると標準入力を表します。
printf '%s\n' one two | cat -
head -n 5 -
tail -n 5 -
ただし、コマンドやオプションによって扱いが異なるため、実際のmanページも確認します。
cat
catは、指定したファイルを順番に読み、その内容を標準出力へ連結して書き出します。名前はconcatenate、連結に由来します。
内容を表示する
cat memo.txt
cat file1.txt file2.txt
複数のファイルを指定すると、指定した順番で連続して表示します。短いファイルの確認に向いています。
複数ファイルを連結して保存する
cat part1.txt part2.txt > combined.txt
cat new_part.txt >> combined.txt
>:出力先を新しく作成するか、既存内容を切り詰めて上書きする>>:既存内容の末尾へ追記する
出力先に既存ファイルを指定すると、>では元の内容が失われます。連結元と出力先を同じファイルにしないよう注意します。
# 危険な例。シェルが先に file1.txt を空にする
cat file1.txt file2.txt > file1.txt
行番号や制御文字を確認する
cat -n file.txt
cat -b file.txt
cat -s file.txt
cat -A file.txt
cat -E file.txt
cat -T file.txt
| オプション | 意味 |
|---|---|
-n |
すべての出力行へ行番号を付ける |
-b |
空行を除く行へ行番号を付ける。-nより優先される |
-s |
連続する複数の空行を一つへまとめる |
-E |
各行末へ$を表示する |
-T |
タブを^Iとして表示する |
-A |
タブ、行末、印字できない文字などを見える形で表示する |
設定ファイルの末尾に余計な空白やタブがあるか、改行コードの見え方がおかしくないかを調べるときは、cat -Aが役立つ場合があります。
大きなファイルには向かない場合がある
catは出力を止めずに端末へ流すため、長いファイルでは必要な場所が一気に画面外へ流れます。その場合はlessを使います。
less
lessは、長いテキストを一画面ずつ移動しながら閲覧するページャーです。ファイル全体を最初に読み込まなくても表示を始められるため、大きなファイルの閲覧にも向いています。
less /var/log/syslog
command | less
基本操作
| キー | 操作 |
|---|---|
| Space、f | 一画面先へ進む |
| b | 一画面前へ戻る |
| Enter、j | 一行進む |
| k | 一行戻る |
| g | 先頭へ移動する |
| G | 末尾へ移動する |
/文字列 | 前方へ検索する |
?文字列 | 後方へ検索する |
| n | 同じ方向の次の一致へ移動する |
| N | 逆方向の次の一致へ移動する |
| q | 終了する |
| h | less内のヘルプを表示する |
よく使うオプション
less -N file.txt
less -S file.txt
less -i file.txt
less +G file.txt
less +F app.log
| 指定 | 意味 |
|---|---|
-N | 各行の先頭へ行番号を表示する |
-S | 長い行を折り返さず、画面幅を超えた部分を切って表示する |
-i | 検索文字列に大文字が含まれない場合、大文字と小文字を区別せず検索する |
+G | ファイルの末尾から表示を始める |
+F | 末尾へ移動し、追記を待ちながら表示する |
less +Fの追跡モードから通常の閲覧へ戻るには、一般にCtrl+Cを押します。その後、検索や上下移動を行い、qで終了できます。
折り返さず横を見る
ログやCSVなど一行が長いファイルでは、less -Sを使うと自動折り返しを止められます。左右の矢印キーなどで横方向へ移動できます。
head
headは、ファイルの先頭部分を表示します。行数を指定しない場合、標準では先頭10行を表示します。
head file.txt
head file1.txt file2.txt
複数ファイルを指定すると、通常はファイル名の見出しを付けて、それぞれの先頭を表示します。
行数を指定する
head -n 5 file.txt
head -5 file.txt
head -n 20 /etc/passwd
-n 数値で、表示する行数を指定します。GNU環境ではhead -5のような短い形式も使えますが、意味が明確な-n 5を覚えておくと整理しやすくなります。
バイト数を指定する
head -c 100 file.bin
head -c 1K file.bin
-cは、先頭から指定したバイト数を表示します。テキストを文字単位で切る機能ではないため、マルチバイト文字の途中で切れることがあります。
末尾の一定行を除く
head -n -5 file.txt
GNU headでは、行数へ負の値を指定すると、末尾の指定行数を除いた部分を表示します。この例は、最後の5行を除いて表示します。
見出しの制御
head -q file1 file2
head -v file.txt
-q:複数ファイルでもファイル名の見出しを表示しない-v:一つのファイルでもファイル名の見出しを表示する
tail
tailは、ファイルの末尾部分を表示します。行数を指定しない場合、標準では末尾10行を表示します。
tail file.txt
tail -n 20 app.log
tail -c 100 file.bin
指定行から末尾まで表示する
tail -n +5 file.txt
-n +5は、先頭から数えて5行目以降を表示します。単に末尾5行を表示するtail -n 5とは意味が異なります。
追記を監視する
tail -f app.log
tail -n 50 -f app.log
-fは、ファイルの末尾を表示した後、ファイルへ追記された内容を継続して表示します。ログをリアルタイムに確認するときに使います。停止するには通常Ctrl+Cを押します。
-fと-F
tail -F app.log
GNU tailの-Fは、概ね--follow=name --retryに相当します。ファイル名を追跡し、ログローテーションなどでファイルが置き換わった場合にも、同じ名前の新しいファイルを開き直そうとします。
一方、標準のtail -fは通常ファイル記述子を追跡するため、ファイル名が新しいファイルへ置き換わっても、古いファイルを追い続ける場合があります。
プロセス終了時に追跡を終える
tail --pid=1234 -f app.log
--pidを-fと組み合わせると、指定したプロセスが終了した後にtailも終了します。GNU固有の機能です。
複数ファイル
tail -f app.log error.log
複数のログを指定すると、どのファイルからの出力かを示す見出しを切り替えながら表示します。
wc
wcは、入力の行数、単語数、バイト数などを数えるコマンドです。名前はword countに由来します。
wc file.txt
オプションを指定しない場合、通常は行数、単語数、バイト数、ファイル名の順に表示します。
よく使うオプション
wc -l file.txt
wc -w file.txt
wc -c file.txt
wc -m file.txt
wc -L file.txt
| オプション | 数えるもの |
|---|---|
-l | 改行文字の数。一般に行数確認として使う |
-w | 空白類で区切られた単語数 |
-c | バイト数 |
-m | 文字数。現在のロケールの文字として数える |
-L | 最も長い行の表示幅 |
-cと-mの違い
ASCII文字だけなら同じ値になることが多いですが、UTF-8の日本語などでは、一文字が複数バイトになるため値が異なる場合があります。
printf 'あ\n' | wc -c
printf 'あ\n' | wc -m
改行文字も入力に含まれるため、この例では「見えている一文字」だけを数えるわけではありません。
複数ファイル
wc -l file1.txt file2.txt
複数ファイルを指定すると、それぞれの値に加え、通常は最後に合計のtotal行を表示します。
パイプから数える
grep ERROR app.log | wc -l
find . -type f -print | wc -l
wc -lは「入力に含まれる改行文字」を数えます。最後の行に改行がないファイルでは、人が見た行数と一つずれることがあります。
パイプとの組み合わせ
閲覧コマンドは、単独よりもパイプと組み合わせることで、必要な情報だけを効率よく確認できます。
コマンド出力をlessで読む
ps aux | less
systemctl status sshd --no-pager
journalctl | less
大量のコマンド出力はlessへ渡すと、検索しながら閲覧できます。コマンド自身がページャーを使う場合もあります。
検索結果の件数を数える
grep -i error app.log | wc -l
この例は、errorに一致した出力行数を数えます。ただし、一行に複数回一致しても、行としては一つです。
先頭・末尾を段階的に切り出す
head -n 100 app.log | tail -n 20
この例は、先頭100行のうち、最後の20行、つまり元ファイルの81行目から100行目を表示します。
最新部分をlessで検索する
tail -n 1000 app.log | less
巨大なログ全体ではなく、末尾1000行だけをlessで検索できます。
複数ファイルを一つの入力として扱う
cat access.log.2 access.log.1 access.log | less
cat part*.txt | wc -l
シェルのワイルドカード展開順が意図した順番か、printf '%s\n' part*.txtなどで確認してから連結します。
ログ確認での使い分け
ログファイルでは、目的に応じて「全体を検索する」「直近を見る」「追記を監視する」を分けます。
直近50行を見る
tail -n 50 /var/log/app.log
直近を見ながら追記を監視する
tail -n 50 -F /var/log/app.log
全体を検索しながら読む
less -N /var/log/app.log
lessを開いた後に、/ERRORで前方検索し、nで次の一致へ移動します。
発生件数を数える
grep 'ERROR' /var/log/app.log | wc -l
ログが大きすぎる場合
tail -n 5000 /var/log/app.log | less -S
必要な時間帯が末尾付近にあるなら、対象範囲を先にtailで絞ると閲覧しやすくなります。
権限エラー
ls -l /var/log/app.log
id
sudo less /var/log/app.log
読めない場合は、ファイルの所有者・グループ・パーミッションと、自分の所属グループを確認します。権限が必要なログだけ、許可された範囲でsudoを使います。
よくある間違いと確認手順
巨大ファイルをcatで一気に流す
端末が壊れるわけではありませんが、必要な部分が流れ、制御文字を含むファイルでは表示が乱れることもあります。まずサイズと種類を確認します。
ls -lh file
file file
less file
バイナリファイルを端末へ表示する
catやlessでバイナリデータを直接表示すると、読めない文字列や端末制御文字が出ることがあります。内容の種類はfileで確認します。
cat file > fileで内容を失う
リダイレクトは、コマンド実行より先にシェルが準備します。出力先を元ファイルと同じにすると、catが読む前にファイルが空になることがあります。
wc -lを必ず論理的な行数だと思う
wc -lが数えるのは改行文字です。末尾に改行がないファイルでは、表示上の最終行を数えない場合があります。
tail -fでローテーション後の新規ログを見逃す
ファイル名が置き換えられる運用では、GNU環境ならtail -Fを検討します。
確認の流れ
ls -lh -- file
file -- file
wc -l -- file
head -n 5 -- file
tail -n 20 -- file
less -N -- file
- ファイルサイズを確認する
- テキストかバイナリかを確認する
- 行数を確認する
- 先頭と末尾を少量だけ見る
- 必要なら
lessで検索しながら読む
詳しい使い方は、次のマニュアルでも確認できます。
man cat
man less
man head
man tail
man wc
30秒チェック
- 長いファイルを検索しながらページ単位で読むコマンドは何でしょうか。
headとtailは、行数を指定しない場合、標準で何行表示するでしょうか。tail -n +5 fileは、どの範囲を表示するでしょうか。- GNU環境で、ログローテーション後も同じファイル名を追いかけ直す用途に向く指定は何でしょうか。
wc -cとwc -mは、何を数えるでしょうか。cat file1 file2 > file1が危険なのはなぜでしょうか。
答えを表示
less- それぞれ10行
- 先頭から数えて5行目以降を末尾まで表示する
tail -F ファイル-cはバイト数、-mは文字数- シェルが先に出力先の
file1を切り詰めるため、catが読む前に元の内容が失われる可能性があるから
要約
catは短いファイルの表示と、複数ファイルの連結に向きます。cat -nは全行、cat -bは空行以外へ行番号を付けます。lessは長いファイルを移動・検索しながら読むページャーです。headは先頭、tailは末尾を、標準ではそれぞれ10行表示します。tail -fは追記を監視し、GNUのtail -Fは同じファイル名を開き直しながら追跡します。wc -lは改行数、-wは単語数、-cはバイト数、-mは文字数を数えます。- パイプを使うと、抽出、範囲指定、閲覧、件数確認を組み合わせられます。
- 巨大なファイルは、まず
ls -lh、file、head、tailで概要を確認します。 >は出力先を切り詰めるため、連結元と出力先を同じファイルにしません。- ログ確認では、直近表示、継続監視、全体検索、件数集計を目的別に使い分けます。