tailコマンドでテキストの末尾を表示 macOS/Linux/Unix
tailコマンドは、Unix系オペレーティングシステムにおいて、テキストファイルの末尾の部分を表示するために使用されます。デフォルトでは、ファイルの最後の10行を出力しますが、この行数はオプションで調整することができます。tailコマンドの基本的な使い方
tail [オプション] [ファイル名]
ここで、よく使用されるオプションは以下の通りです:
オプション | 説明 |
---|---|
-n オプション | 表示する行数を指定します。-n 5のように使用し、最後の5行を表示します。 |
-f オプション | ファイルの末尾に追加されたデータをリアルタイムで表示します。 |
とくに-fオプションは、ログファイルの監視に便利です。
tailコマンドの使用例
ファイルの最後の10行を表示する
tail ファイル名
ファイルの最後の5行を表示する
tail -n 5 ファイル名
ファイルの末尾をリアルタイムで監視する
tail -f ファイル名
他のコマンドと組み合わせた応用例
tailコマンドは他のUnixコマンドと組み合わせて使用されることが多く、その応用は非常に多岐にわたります。以下に、いくつかの一般的な例を紹介します。grepとの組み合わせ
特定のパターンを含む行のみをファイルの末尾から表示します。ログファイルから特定のエラーメッセージを探す場合などに便利です。
tail -f ファイル名 | grep "検索パターン"
awkとの組み合わせ
tailで取得した出力をさらに処理し、特定のフォーマットに変換したり、特定のデータを抽出したりします。awkを使用して特定のカラムのみを表示する例:tail -n 10 ファイル名 | awk '{print $1}'
sedとの組み合わせ
sedを使用して特定の文字列を置換する例:tail -n 10 ファイル名 | sed 's/置換前の文字列/置換後の文字列/g'
sortとの組み合わせ
ファイルの最後の部分の行を特定の基準でソートして表示します。
tail -n 10 ファイル名 | sort
headとの組み合わせ
ファイルの最後の部分から特定の行数を取得した後、さらにその中の最初の数行だけを表示します。例えば、ファイルの最後の20行のうち、最初の5行だけを表示する場合に便利です。
tail -n 20 ファイル名 | head -n 5
これらの応用例は、ログファイルの監視、データ分析、システム管理タスクの自動化など、多岐にわたるタスクに利用することができます。
ログ表示マスター編
awkと組み合わせて色をつける
次は、ログレベル毎に色分けして表示してくれるスクリプトで、とても便利です。
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 として保存します。
#!/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 のようにして、実行しやすくするととても便利です!
#!/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 などのログレベルを付与することで、レベル以下の不要なログをフィルタリングできます。
./ctail.sh /path/to/log/file WARN