tailコマンドでテキストの末尾を表示 macOS/Linux/Unix

tailコマンドは、Unix系オペレーティングシステムにおいて、テキストファイルの末尾の部分を表示するために使用されます。デフォルトでは、ファイルの最後の10行を出力しますが、この行数はオプションで調整することができます。

tailコマンドの基本的な使い方

bash
tail [オプション] [ファイル名]

ここで、よく使用されるオプションは以下の通りです:

オプション説明
-n オプション表示する行数を指定します。-n 5のように使用し、最後の5行を表示します。
-f オプションファイルの末尾に追加されたデータをリアルタイムで表示します。

とくに-fオプションは、ログファイルの監視に便利です。

tailコマンドの使用例

ファイルの最後の10行を表示する

bash
tail ファイル名

ファイルの最後の5行を表示する

bash
tail -n 5 ファイル名

ファイルの末尾をリアルタイムで監視する

bash
tail -f ファイル名
tailコマンドは、ログファイルの監視や、大きなファイルから最新の情報を素早く取得する際に特に便利です。

他のコマンドと組み合わせた応用例

tailコマンドは他のUnixコマンドと組み合わせて使用されることが多く、その応用は非常に多岐にわたります。以下に、いくつかの一般的な例を紹介します。

grepとの組み合わせ

特定のパターンを含む行のみをファイルの末尾から表示します。ログファイルから特定のエラーメッセージを探す場合などに便利です。

bash
tail -f ファイル名 | grep "検索パターン"

awkとの組み合わせ

tailで取得した出力をさらに処理し、特定のフォーマットに変換したり、特定のデータを抽出したりします。awkを使用して特定のカラムのみを表示する例:
bash
tail -n 10 ファイル名 | awk '{print $1}'

sedとの組み合わせ

sedを使用して特定の文字列を置換する例:
bash
tail -n 10 ファイル名 | sed 's/置換前の文字列/置換後の文字列/g'

sortとの組み合わせ

ファイルの最後の部分の行を特定の基準でソートして表示します。

bash
tail -n 10 ファイル名 | sort

headとの組み合わせ

ファイルの最後の部分から特定の行数を取得した後、さらにその中の最初の数行だけを表示します。例えば、ファイルの最後の20行のうち、最初の5行だけを表示する場合に便利です。

bash
tail -n 20 ファイル名 | head -n 5

これらの応用例は、ログファイルの監視、データ分析、システム管理タスクの自動化など、多岐にわたるタスクに利用することができます。

ログ表示マスター編

awkと組み合わせて色をつける

次は、ログレベル毎に色分けして表示してくれるスクリプトで、とても便利です。

bash
tail -f /path/to/logfile | awk '
{
    if ($0 ~ /ERROR/) {
        print "\033[31m" $0 "\033[39m" # 赤色
    } else if ($0 ~ /WARN/) {
        print "\033[33m" $0 "\033[39m" # 黄色
    } else if ($0 ~ /INFO/) {
        print "\033[32m" $0 "\033[39m" # 緑色
    } else {
        print $0
    }
}'

ログにハイライト表示してくれるツールはありますが、awkを使った方法でも十分で、カスタマイズも簡単です。シェルスクリプト化しておいて、簡単に呼び出せるようにすると良いと思います。例えば以下のようなシェルスクリプトを log_colorizer.sh として保存します。

bash
#!/bin/bash

# ログファイルパスを引数から取得
LOG_FILE=$1

# ログレベルを変数で管理
LEVEL_ERROR="ERROR"
LEVEL_WARN="WARN"
LEVEL_INFO="INFO"
LEVEL_DEBUG="DEBUG"
LEVEL_CUSTOM="CUSTOM"

# tail コマンドでログファイルを監視し、awk で色付け
tail -n 1000 -f "$LOG_FILE" | awk -v error="$LEVEL_ERROR" -v warn="$LEVEL_WARN" -v info="$LEVEL_INFO" -v debug="$LEVEL_DEBUG" -v custom="$LEVEL_CUSTOM" '
{
    if ($0 ~ error) {
        print "\033[31m" $0 "\033[39m" # 赤色
    } else if ($0 ~ warn) {
        print "\033[33m" $0 "\033[39m" # 黄色
    } else if ($0 ~ info) {
        print "\033[32m" $0 "\033[39m" # 緑色
    } else if ($0 ~ debug) {
        print "\033[34m" $0 "\033[39m" # 青色
    } else if ($0 ~ custom) {
        print "\033[35m" $0 "\033[39m" # 紫色
    } else {
        print $0
    }
}'

実行権限を追加して ./log_colorizer.sh /path/to/log/file で実行すれば、下図のようにログレベルに応じて色付け表示されてとても見やすくなります。

ログレベルに応じて色付け
ログレベルに応じて色付け

▼ awkの使い方はこちらの記事をご参考ください。

ログ表示をレベル制限してハイライト表示できる ctail.sh

先ほどご紹介した log_colorizer.sh をさらに発展させてみました。ctail.sh と名づけ、bin ディレクトリなどに保存して ctail /path/to/log/file WARN のようにして、実行しやすくするととても便利です!

ctail.sh
#!/bin/bash

# ログレベルとログファイルパスを引数から取得
LOG_FILE=$1
LOG_LEVEL=$2

# ログレベルの優先度を定義
LEVEL_ERROR="ERROR"
LEVEL_WARN="WARN"
LEVEL_INFO="INFO"
LEVEL_DEBUG="DEBUG"
LEVEL_CUSTOM="mopi"

# ログレベルの優先度を設定
declare -A LEVELS
LEVELS=([mopi]=1 [ERROR]=2 [WARN]=3 [INFO]=4 [DEBUG]=5)

# tail コマンドでログファイルを監視し、awk で色付けとフィルタリング
tail -n 1000 -f "$LOG_FILE" | awk -v error="$LEVEL_ERROR" -v warn="$LEVEL_WARN" -v info="$LEVEL_INFO" -v debug="$LEVEL_DEBUG" -v custom="$LEVEL_CUSTOM" -v min_level="${LEVELS[$LOG_LEVEL]}" '
function level_priority(level) {
    if (level == "mopi") return 1;
    if (level == "ERROR") return 2;
    if (level == "WARN") return 3;
    if (level == "INFO") return 4;
    if (level == "DEBUG") return 5;
    return 999; # 不明なレベルは最下位扱い
}
{
    log_level = 999;
    if ($0 ~ custom) {
        log_level = level_priority("mopi");
        color = "\033[35m"; # 紫色
    } else if ($0 ~ error) {
        log_level = level_priority("ERROR");
        color = "\033[31m"; # 赤色
    } else if ($0 ~ warn) {
        log_level = level_priority("WARN");
        color = "\033[33m"; # 黄色
    } else if ($0 ~ info) {
        log_level = level_priority("INFO");
        color = "\033[32m"; # 緑色
    } else if ($0 ~ debug) {
        log_level = level_priority("DEBUG");
        color = "\033[34m"; # 青色
    } else {
        log_level = level_priority("DEBUG");
        color = "\033[0m"; # デフォルト
    }

    # 指定したログレベル以上のもののみを表示
    if (log_level <= min_level) {
        print color $0 "\033[39m";
    }
}
'

使い方は以下の通り、最後に WARN などのログレベルを付与することで、レベル以下の不要なログをフィルタリングできます。

bash
./ctail.sh /path/to/log/file WARN

関連記事

 
最後までご覧いただきありがとうございます!

▼ 記事に関するご質問やお仕事のご相談は以下よりお願いいたします。
お問い合わせフォーム

関連記事