head・tail・パイプの使い方 - Linuxファイル操作の応用

head・tail・パイプの使い方 - Linuxファイル操作の応用

基本的なファイル操作をマスターしたら、次は高度なテクニックを身につけよう。この応用編では、head・tail・file・stat・パイプ・リダイレクトを使った実践的なファイル分析と操作技術を解説する。

head・tail - ログ解析とファイル分析術

headtailは、実務で最も頻繁に使用されるファイル分析コマンドだ。特にサーバーのログ解析やデバッグ作業で欠かせない。

head - ファイル先頭のスマート表示

基本的な使用方法

$ head access.log

デフォルトで先頭10行を表示。ファイルの構造把握に最適。

行数指定で柔軟な表示

$ head -n 5 error.log     # 先頭5行
$ head -5 error.log        # 短縮形
$ head -n 100 config.txt   # 先頭100行

複数ファイルの一括確認

$ head -n 3 *.log
==> access.log <==
192.168.1.10 - - [11/Jan/2025:10:00:01] "GET /"
192.168.1.11 - - [11/Jan/2025:10:00:02] "GET /api"
192.168.1.12 - - [11/Jan/2025:10:00:03] "POST /login"

==> error.log <==
[2025-01-11 10:00:01] ERROR: Database connection failed
[2025-01-11 10:00:05] WARN: Slow query detected
[2025-01-11 10:00:10] ERROR: Authentication failed

複数ログファイルの内容を一度に確認できる。

tail - 最新情報とリアルタイム監視

最新エラーの確認

$ tail error.log

デフォルトで末尾10行。最新のエラーやイベントを素早く特定できる。

リアルタイムログ監視(最重要)

$ tail -f /var/log/app.log

実務で最も使用頻度の高い機能。ログをリアルタイムで監視し、新しい行が追加されると自動表示する。終了方法:Ctrl+C

特定位置からの表示

$ tail -n +50 large_file.txt  # 50行目から最後まで
$ tail -n 20 access.log       # 末尾20行

実務での高度なログ解析テクニック

エラー発生時刻の特定と追跡

# エラー発生直前のコンテキストを確認
$ grep -n "ERROR" app.log | tail -1  # 最新エラーの行番号取得
47:ERROR: Connection timeout

# その周辺を詳細確認
$ head -n 50 app.log | tail -n 10  # 41-50行目表示

ログローテーション対応の監視

# ログファイルがローテートしても監視継続
$ tail -F /var/log/app.log  # 大文字Fでファイル再作成に対応

複数ログの同時監視

# 複数のログファイルを同時に監視
$ tail -f /var/log/app.log /var/log/error.log

# さらに高度な方法:multitailコマンド
$ multitail /var/log/app.log /var/log/error.log /var/log/access.log

プロのhead/tail使用テクニック

パフォーマンス問題の追跡

# アクセスログの最新トレンドを確認
$ tail -f access.log | grep "slow\|timeout\|error"

デプロイ時のリアルタイムモニタリング

# デプロイ実行中に別ターミナルで
$ tail -f /var/log/deploy.log | tee deploy_$(date +%Y%m%d).log

ファイルサイズに応じた適切な選択

# 小さなファイルはcat、大きなファイルはhead/tail
$ wc -l logfile.txt          # 行数確認
$ [[ $(wc -l < file.txt) -gt 50 ]] && head file.txt || cat file.txt

file・stat - ファイル情報の詳細調査

ファイルの正体や詳細情報を調べるコマンドだ。セキュリティチェックやデバッグ作業で非常に有用。

file - ファイルタイプの特定

基本的なファイル診断

$ file mysterious_file
mysterious_file: UTF-8 Unicode text, with CRLF line terminators

ファイルの種類、エンコーディング、改行コードを特定できる。

複数ファイルの一括診断

$ file *
config.txt:     ASCII text
data.bin:       data
image.jpg:      JPEG image data, JFIF standard
script.sh:      Bourne-Again shell script, ASCII text executable
archive.tar.gz: gzip compressed data

セキュリティチェックでの活用

# 拡張子偽装の検出
$ file suspicious_file.txt
suspicious_file.txt: PE32 executable (console) Intel 80386, for MS Windows
# .txtだが実際はWindows実行ファイル!

拡張子と実際のファイルタイプが異なる場合は、悪意あるファイルの可能性がある。

stat - 詳細なファイル情報

完全なファイル情報表示

$ stat important_file.txt
  File: important_file.txt
  Size: 1024      	Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d	Inode: 1234567    Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/username)   Gid: ( 1000/usergroup)
Access: 2025-01-11 10:30:45.123456789 +0900
Modify: 2025-01-11 10:25:30.987654321 +0900
Change: 2025-01-11 10:25:30.987654321 +0900
 Birth: 2025-01-11 10:20:15.555666777 +0900

ファイルサイズ、権限、タイムスタンプの詳細情報を確認できる。

カスタムフォーマットで表示

# サイズと更新日時のみ表示
$ stat --format="%n: %s bytes, modified %y" *.txt
config.txt: 2048 bytes, modified 2025-01-11 09:15:22.123456789 +0900
log.txt: 51200 bytes, modified 2025-01-11 10:45:33.987654321 +0900

実務での活用シナリオ

ファイル変更の追跡調査

# セキュリティインシデント対応
$ stat --format="%n - Last modified: %y, Last accessed: %x" /etc/passwd
/etc/passwd - Last modified: 2025-01-11 08:30:15.123456789 +0900, Last accessed: 2025-01-11 10:45:22.987654321 +0900

# 不正アクセスがあったかどうか確認

ディスクスペースの診断

# 大きなファイルの詳細情報
$ stat --format="%n: %s bytes (%S blocks)" large_files/*
database.db: 1073741824 bytes (262144 blocks)
backup.tar.gz: 536870912 bytes (131072 blocks)

シンボリックリンクの診断

$ file suspicious_link
suspicious_link: symbolic link to /tmp/malicious_file

$ stat suspicious_link
  File: suspicious_link -> /tmp/malicious_file
  Size: 18        	Blocks: 0          IO Block: 4096   symbolic link

リンク先の特定と安全性確認に使う。

file/stat コマンドのプロ活用術

バッチ処理でのファイルタイプフィルタリング

# 実行ファイルだけを抽出
for f in *; do
    [[ $(file "$f") == *"executable"* ]] && echo "$f"
done

ファイルサイズでの一括ソート

# サイズ順でファイル一覧
stat --format="%s %n" * | sort -n | tail -10

パイプとリダイレクト

複数のコマンドを組み合わせて、強力な処理を実現する。

パイプ(|)

あるコマンドの出力を別のコマンドの入力に渡す。

$ ls -la | grep ".txt"

.txtファイルのみを表示できる。

リダイレクト

記号 説明
> 出力をファイルに上書き ls > list.txt
>> 出力をファイルに追記 echo "text" >> file.txt
< ファイルから入力 sort < data.txt
2> エラー出力をリダイレクト command 2> error.log
&> 標準出力とエラー出力を同じファイルに command &> all.log

実践的な組み合わせ技

実際の作業でよく使用するコマンドの組み合わせ例を紹介する。

例1:ログファイルからエラーを抽出して集計

$ grep "ERROR" app.log | cut -d' ' -f3 | sort | uniq -c | sort -rn

エラーの種類別に出現回数を降順で表示する。

例2:大きなファイルTOP10を見つける

$ find . -type f -exec ls -lh {} \; | sort -k5 -rh | head -10

カレントディレクトリ以下で最も大きい10個のファイルを表示する。

例3:特定の拡張子のファイル数を数える

$ find . -name "*.txt" | wc -l

.txtファイルの総数を表示する。

例4:プロセスのメモリ使用量TOP5

$ ps aux | sort -k4 -rn | head -5

メモリ使用率が高い順に5つのプロセスを表示する。

例5:ファイルのバックアップを作成

$ find . -name "*.conf" -exec cp {} {}.backup \;

すべての.confファイルのバックアップを作成する。

実践演習:日常業務シナリオ

実際の業務でよく発生するシナリオを通じて、ファイル操作コマンドの実践的な使い方を学ぶ。

シナリオ1:サーバーメンテナンス作業

タスク:ログファイルのローテーションとアーカイブ

# 1. 現在のログファイルサイズ確認
$ ls -lah /var/log/app.log

# 2. 最新エラーの確認
$ tail -20 /var/log/app.log | grep "ERROR"

# 3. 安全なアーカイブ作成
$ cp /var/log/app.log /var/log/archive/app.log.$(date +%Y%m%d)

# 4. ログのクリア(サービス停止中に実行、root権限が必要)
$ sudo sh -c '> /var/log/app.log'  # ファイルを空にする

シナリオ2:アプリケーションデプロイ

タスク:新バージョンの安全なデプロイ

# 1. 現在のバージョンをバックアップ
$ cp -rp /opt/myapp /opt/myapp.backup.$(date +%Y%m%d_%H%M%S)

# 2. 新バージョンの展開と確認
$ tar -tf new_version.tar.gz | head -10  # 中身確認
$ tar -xzf new_version.tar.gz -C /tmp/  # 一時展開

# 3. 設定ファイルのマージ
$ cp /opt/myapp/config.ini /tmp/myapp/config.ini
$ diff /opt/myapp/config.ini /tmp/myapp/config.ini  # 差分確認

# 4. 本番環境への安全な上書き
$ mv /opt/myapp /opt/myapp.old
$ mv /tmp/myapp /opt/myapp

シナリオ3:セキュリティインシデント対応

タスク:不正アクセスの調査と証拠保全

# 1. アクセスログの緊急バックアップ
$ cp /var/log/access.log /home/incident/access.log.$(date +%Y%m%d_%H%M%S)

# 2. 不正アクセスの日時特定
$ grep "suspicious_pattern" /var/log/access.log | head -1
$ grep "suspicious_pattern" /var/log/access.log | tail -1

# 3. 該当時間帯のログ抽出
$ awk '/2025-01-11 10:30:/,/2025-01-11 11:00:/' /var/log/access.log > incident_logs.txt

# 4. 関連ファイルの情報収集
$ stat /var/log/access.log > file_metadata.txt
$ file /var/log/access.log >> file_metadata.txt

シナリオ4:ディスクスペースクリーンアップ

タスク:安全な不要ファイルの削除

# 1. ディスク使用量の確認
$ df -h
$ du -sh /var/log/* | sort -hr | head -10

# 2. 古いログファイルの特定
$ find /var/log -name "*.log" -mtime +30 -type f

# 3. 安全な削除順序
$ find /var/log -name "*.log" -mtime +30 -type f -exec ls -la {} \;  # 確認
$ find /var/log -name "*.log" -mtime +30 -type f -ok rm {} \;      # 確認付き削除

# 4. 削除後の確認
$ df -h  # スペースが増えたか確認

練習問題:安全環境で試してみよう

基礎編:ファイル操作の基本

  1. test.txt というファイルを作成し、「初期データ」と書き込み
  2. test.txt を test_backup.txt としてコピー
  3. test.txt を test_renamed.txt にリネーム
  4. test_backup.txt の内容を表示
  5. 不要なファイルを安全に削除

中級編:実務シミュレーション

  1. 「project」ディレクトリを作成し、その中に config.ini, app.py, README.md を作成
  2. project ディレクトリ全体をタイムスタンプ付きでバックアップ
  3. config.ini の内容を変更し、元のファイルとの差分を確認
  4. 問題があった場合のロールバック手順を実行

まとめ:安全なファイル操作マスターへ

この記事で学んだ重要ポイント:

  • head/tail:ログ解析とリアルタイム監視の必須テクニック
  • file/stat:セキュリティチェックとデバッグの強い味方
  • パイプ・リダイレクト:複数コマンドの強力な組み合わせ
  • 実践演習:実務シナリオでの総合活用

実務では「安全第一」で操作し、常にバックアップと確認を欠かさずに。一度のミスが取り返しのつかない結果をもたらす可能性を常に意識すること。

次に読む