Linuxでファイルの1行目だけ表示する方法|headやsedの簡単テクニック

Linux

Linuxでテキストファイルを扱っていると、 「このファイルの1行目だけ確認したい」 と思うことがよくあります。

  • CSVのヘッダーだけ見たい
  • ログファイルの最初の行だけチェックしたい
  • 設定ファイルのコメント行を確認したい

こんなとき、ファイル全体を cat で表示すると長すぎて大変です。

この記事では、Linuxでファイルの1行目だけを表示する簡単な方法を紹介します。

スポンサーリンク

1行目表示が必要になる場面

よくある使用場面

CSV・TSVファイルの構造確認

  • ヘッダー行の列名確認
  • データの形式チェック
  • インポート前の事前確認

ログファイルの分析

  • ログ形式の確認
  • 開始時刻の把握
  • ファイルの種類特定

設定ファイルの管理

  • 設定ファイルの説明コメント確認
  • バージョン情報の取得
  • ファイル形式の判別

プログラムファイルの確認

  • シェルスクリプトのshebang確認
  • プログラムのコメント行チェック
  • ファイル形式の判定

なぜ1行目だけが重要?

効率性

  • 巨大ファイルでも瞬時に確認可能
  • ネットワーク経由でも高速
  • システム負荷を最小限に抑制

実用性

  • 必要最小限の情報で判断可能
  • 作業の方向性を早期決定
  • エラー確認の初期診断

最も簡単なhead コマンド

基本的な使い方

基本構文:

head -n 1 <ファイル名>

-n オプションの意味:

  • -n 1:先頭から1行だけ表示
  • 数値を変更すれば、N行目まで表示可能

実際の使用例

ログファイルの1行目確認:

head -n 1 /var/log/messages

出力例:

Jan 15 10:30:45 server01 systemd[1]: Started Session 1234 of user root.

CSVファイルのヘッダー確認:

head -n 1 sales_data.csv

出力例:

Date,Product,Quantity,Price,Total

設定ファイルの確認:

head -n 1 /etc/passwd

出力例:

root:x:0:0:root:/root:/bin/bash

head の便利なオプション

バイト数での指定:

head -c 50 filename.txt  # 最初の50バイトを表示

複数ファイルの同時確認:

head -n 1 file1.txt file2.txt file3.txt

出力例:

==> file1.txt <==
First line of file1

==> file2.txt <==
First line of file2

==> file3.txt <==
First line of file3

ファイル名を非表示にしたい場合:

head -n 1 -q file1.txt file2.txt  # ファイル名のヘッダーを表示しない

sed を使った方法

sed の基本的な使い方

基本構文:

sed -n '1p' <ファイル名>

オプションの詳細:

  • -n:パターンスペースの自動出力を抑制
  • '1p':1行目のみを印刷(print)

実用例

標準的な使用:

sed -n '1p' /etc/hosts

パイプとの組み合わせ:

cat large_file.txt | sed -n '1p'

プロセス出力の1行目取得:

ps aux | sed -n '1p'

出力例:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

sed の高度な使い方

条件付き表示:

# 1行目が特定パターンの場合のみ表示
sed -n '1{/^#/p}' config.txt  # 1行目がコメント行の場合のみ表示

置換と組み合わせ:

# 1行目の特定文字を置換して表示
sed -n '1s/old/new/p' filename.txt

複数行の範囲指定:

sed -n '1,3p' filename.txt  # 1〜3行目を表示

awk を使った方法

awk の基本的な使い方

基本構文:

awk 'NR==1' <ファイル名>

変数の説明:

  • NR:Number of Records(現在の行番号)
  • ==1:行番号が1の場合のみ処理実行

実用例

基本的な使用:

awk 'NR==1' mydata.csv

特定フィールドのみ表示:

# CSV の1行目の1列目のみ表示
awk -F',' 'NR==1 {print $1}' data.csv

条件付き処理:

# 1行目が特定条件を満たす場合のみ表示
awk 'NR==1 && /^Date/ {print}' data.csv

awk の高度な活用

フィールド数の確認も同時に:

awk 'NR==1 {print "Line: " $0 "\nFields: " NF}' data.csv

1行目を変数に格納:

awk 'NR==1 {header=$0} NR>1 {print header; print $0; exit}' data.csv

CSVヘッダーの整形表示:

awk -F',' 'NR==1 {for(i=1;i<=NF;i++) printf "%d: %s\n", i, $i}' data.csv

出力例:

1: Date
2: Product
3: Quantity
4: Price

他の方法と応用テクニック

tail との組み合わせ

tail を使った応用:

tail -n +1 <ファイル> | head -n 1

これが有用な場面:

  • ファイルの先頭にバイナリデータがある場合
  • 特殊文字でhead が正常動作しない場合

less・more との組み合わせ

インタラクティブな確認:

head -n 1 large_file.txt && echo "Press Enter to continue..." && read && less large_file.txt

grep との組み合わせ

条件に合う行のみ表示:

# 1行目がコメント行の場合のみ表示
head -n 1 config.txt | grep "^#"

パターンマッチング:

# 1行目に特定の文字列が含まれるかチェック
head -n 1 *.txt | grep -l "#!/bin/bash"

複数ファイルでの一括処理

複数ファイルの1行目を一括表示

基本的な一括表示:

head -n 1 *.csv

ファイル名なしで一括表示:

for file in *.txt; do
    echo "=== $file ==="
    head -n 1 "$file"
    echo
done

CSVヘッダーの一括確認:

find . -name "*.csv" -exec head -n 1 {} \; -print

スクリプト化

first_line.sh(1行目表示スクリプト):

#!/bin/bash
# ファイルの1行目を表示するスクリプト

show_help() {
    cat << EOF
使用法: $0 [オプション] <ファイル名...>

オプション:
    -v, --verbose    ファイル名も表示
    -q, --quiet      ファイル名を表示しない
    -n, --number     行番号を表示
    -c, --count      文字数もカウント
    -h, --help       このヘルプを表示

例:
    $0 file.txt                    # 1行目のみ表示
    $0 -v *.csv                   # 複数ファイルの1行目をファイル名付きで表示
    $0 -c data.txt                # 1行目と文字数を表示
EOF
}

# デフォルト設定
VERBOSE=false
QUIET=false
SHOW_NUMBER=false
SHOW_COUNT=false

# オプション解析
while [[ $# -gt 0 ]]; do
    case $1 in
        -v|--verbose)
            VERBOSE=true
            shift
            ;;
        -q|--quiet)
            QUIET=true
            shift
            ;;
        -n|--number)
            SHOW_NUMBER=true
            shift
            ;;
        -c|--count)
            SHOW_COUNT=true
            shift
            ;;
        -h|--help)
            show_help
            exit 0
            ;;
        -*)
            echo "未知のオプション: $1"
            show_help
            exit 1
            ;;
        *)
            break
            ;;
    esac
done

# ファイル処理
for file in "$@"; do
    if [ ! -f "$file" ]; then
        echo "エラー: ファイル '$file' が見つかりません" >&2
        continue
    fi
    
    # ファイル名表示
    if [ "$VERBOSE" = true ] || ([ "$QUIET" = false ] && [ $# -gt 1 ]); then
        echo "==> $file <=="
    fi
    
    # 1行目取得
    first_line=$(head -n 1 "$file")
    
    # 行番号表示
    if [ "$SHOW_NUMBER" = true ]; then
        echo -n "1: "
    fi
    
    # 行内容表示
    echo "$first_line"
    
    # 文字数表示
    if [ "$SHOW_COUNT" = true ]; then
        char_count=$(echo -n "$first_line" | wc -c)
        echo "文字数: $char_count"
    fi
    
    # 複数ファイルの場合は空行を追加
    if [ $# -gt 1 ] && [ "$QUIET" = false ]; then
        echo
    fi
done

パフォーマンスと効率性

大きなファイルでのパフォーマンス比較

速度テスト例:

# 10GB のファイルでの比較
time head -n 1 huge_file.txt
time sed -n '1p' huge_file.txt
time awk 'NR==1 {print; exit}' huge_file.txt

一般的な結果:

  1. head – 最も高速(ファイル全体を読まない)
  2. awk with exit – 中程度(1行目で処理終了)
  3. sed – やや遅い(設計上、入力を最後まで処理)

メモリ効率的な処理

大きなファイルでも安全:

# メモリ使用量を抑えて1行目取得
head -n 1 very_large_file.txt

ネットワーク経由のファイル:

# SSH経由でリモートファイルの1行目取得
ssh user@server "head -n 1 /path/to/file.txt"

エラーハンドリングとトラブルシューティング

よくあるエラーと対処法

ファイルが存在しない場合:

if [ -f "$filename" ]; then
    head -n 1 "$filename"
else
    echo "ファイル '$filename' が見つかりません"
fi

権限がない場合:

# 権限エラーを回避
sudo head -n 1 /root/secure_file.txt

バイナリファイルの場合:

# テキストファイルかチェックしてから実行
if file "$filename" | grep -q "text"; then
    head -n 1 "$filename"
else
    echo "$filename はテキストファイルではありません"
fi

空ファイルの場合:

# 空ファイルチェック
if [ -s "$filename" ]; then
    head -n 1 "$filename"
else
    echo "ファイル '$filename' は空です"
fi

特殊文字を含むファイル名の処理

スペースを含むファイル名:

head -n 1 "file with spaces.txt"

特殊文字を含むファイル名:

find . -name "*.txt" -print0 | xargs -0 -I {} head -n 1 "{}"

実用的な活用例

ログ分析での活用

複数ログファイルの開始時刻確認:

for log in /var/log/*.log; do
    echo "=== $(basename $log) ==="
    head -n 1 "$log" | awk '{print $1, $2, $3}'
done

エラーログの形式確認:

head -n 1 /var/log/error.log | cut -d' ' -f1-3

データ処理での活用

CSVファイルの列数確認:

head -n 1 data.csv | awk -F',' '{print "列数:", NF}'

データ形式の自動判定:

first_line=$(head -n 1 data_file.txt)
if [[ "$first_line" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2} ]]; then
    echo "日付形式のデータファイルです"
elif [[ "$first_line" =~ , ]]; then
    echo "CSV形式のファイルです"
fi

システム管理での活用

設定ファイルの種類確認:

head -n 1 /etc/nginx/nginx.conf | grep -q "^#" && echo "コメント行で開始"

スクリプトファイルのshebang確認:

find /usr/local/bin -type f -executable | while read script; do
    shebang=$(head -n 1 "$script" 2>/dev/null)
    if [[ "$shebang" =~ ^#! ]]; then
        echo "$script: $shebang"
    fi
done

まとめ

基本コマンドの使い分け

最もシンプル(推奨):

head -n 1 ファイル名

sed での処理:

sed -n '1p' ファイル名

awk での処理:

awk 'NR==1' ファイル名

使い分けの指針

head を使う場合:

  • 単純に1行目だけが欲しい
  • 高速処理が必要
  • 初心者でも分かりやすさを重視

sed を使う場合:

  • 1行目の加工も同時に行いたい
  • パイプラインでの処理が中心
  • より複雑な条件での抽出

awk を使う場合:

  • フィールド処理も必要
  • 条件判定も同時に行いたい
  • プログラミング的な処理が必要

実用的なポイント

効率性:

  • 大きなファイルでも瞬時に結果取得
  • システムリソースの節約
  • ネットワーク転送量の削減

汎用性:

  • 複数ファイルの一括処理可能
  • パイプラインでの連携
  • スクリプト化による自動化

安全性:

  • ファイル全体を読み込まないため安全
  • エラーハンドリングの実装
  • 権限チェックとの組み合わせ

これらのテクニックを覚えておけば、ログやCSVの先頭チェックなど、ちょっとした作業が格段に効率化します。

ぜひ今日から活用してみてください!

コメント

タイトルとURLをコピーしました