【Linux】head、tailコマンドを組み合わせて開始・終了行を指定する

【Linux】head、tailコマンドを組み合わせて開始・終了行を指定する

記事の文字数:1850

Linuxのtailとheadコマンドを組み合わせて、ファイルの特定範囲の行を取得する方法を詳しく解説します。基本的な使い方から応用例まで、具体的なコマンドやスクリプトの活用方法を紹介します。必要なデータを効率的に抽出し、業務の効率化やログ解析などに役立てることができます。


スポンサーリンク

headコマンドおよびtailコマンドで、ファイルの先頭・末尾を表示する方法を説明します。
またLinuxのtailheadコマンドを組み合わせることで、ファイルの特定の範囲の行を取得することができます。
本記事では、その方法を詳しく解説します。

使用サンプルファイル

以下サンプルファイルを使用して説明します。

test1.txt
$ cat test1.txt
1: AAA
2: BBB
3: CCC
4: DDD
5: EEE
6: FFF
7: GGG
8: HHH
9: III
10: JJJ
11: KKK
12: LLL
13: MMM
14: NNN
15: OOO
test2.txt
$ cat test2.txt
1: OOO
2: NNN
3: MMM
4: LLL
5: KKK
6: JJJ
7: III
8: HHH
9: GGG
10: FFF
11: EEE
12: DDD
13: CCC
14: BBB
15: AAA

ファイルの先頭を表示(head)

ファイルの先頭を表示する際は、headコマンドを利用します。

headコマンドの構文

ファイルの先頭を表示する(10行)

構文
head [ファイル名]

ファイルの先頭から3行表示する

構文
head -n 3 [ファイル名]

ファイルの先頭から12文字表示する

構文
head -c 12 [ファイル名]

headコマンド実行例

ファイルの先頭から10行を表示します。

実行コマンド
head test1.txt

オプションを指定しなければ、デフォルトで10行出力されます。

実行結果
1: AAA
2: BBB
3: CCC
4: DDD
5: EEE
6: FFF
7: GGG
8: HHH
9: III
10: JJJ

ファイルの先頭から3行を表示します。

実行コマンド
head -n 3 test1.txt

-nオプション指定で3行が出力されます。

実行結果
1: AAA
2: BBB
3: CCC

複数ファイルの先頭から3行ずつを表示します。

実行コマンド
head -n 3 test1.txt test2.txt

複数ファイルの場合は、ファイル名を含んで出力します。

実行結果
==> test1.txt <==
1: AAA
2: BBB
3: CCC
==> test2.txt <==
1: OOO
2: NNN
3: MMM

複数ファイルの先頭から3行ずつを表示します。(ファイル名を含まない)

実行コマンド
head -n 3 -q test1.txt test2.txt

-qオプションでファイル名が非表示になります。

実行結果
1: AAA
2: BBB
3: CCC
1: OOO
2: NNN
3: MMM

ファイルの先頭から14文字(改行含む)+ファイル名を表示する。

実行コマンド
head -c 14 -v test1.txt

1ファイル指定でもファイル名を明示的に表示する場合は、-vオプションを指定します。

実行結果
==> test1.txt <==
1: AAA
2: BBB

ファイルの末尾を表示(tail)

ファイルの末尾を表示する際は、tailコマンドを利用します。
(オプションの使用方法はheadコマンドと同様です。)

tailコマンドの構文

ファイルの末尾を表示する(10行)

構文
tail [ファイル名]

ファイルの末尾から3行表示する

構文
tail -n 3 [ファイル名]

ファイルの3行目から末尾まで表示する

構文
tail -n +3 [ファイル名]

ファイルの末尾から12文字表示する

構文
tail -c 12 [ファイル名]

tailコマンド実行例

ファイルの末尾から10行を表示します。

実行コマンド
tail test1.txt

オプションを指定しなければ、デフォルトで10行出力されます。

実行結果
6: FFF
7: GGG
8: HHH
9: III
10: JJJ
11: KKK
12: LLL
13: MMM
14: NNN
15: OOO

ファイルの末尾から3行を表示します。

実行コマンド
tail -n 3 test1.txt

-nオプション指定で3行出力されます。

実行結果
13: MMM
14: NNN
15: OOO

複数ファイルの末尾から3行ずつを表示します。

実行コマンド
tail -n 3 test1.txt test2.txt

複数ファイルの場合、ファイル名を含んで出力します。

実行結果
==> test1.txt <==
13: MMM
14: NNN
15: OOO
==> test2.txt <==
13: CCC
14: BBB
15: AAA

複数ファイルの末尾から3行ずつを表示します。(ファイル名を含まない)

実行コマンド
tail -n 3 -q test1.txt test2.txt

-qオプションでファイル名が非表示になります。

実行結果
13: MMM
14: NNN
15: OOO
13: CCC
14: BBB
15: AAA

ファイルの3行目から末尾までを表示します。
-nオプションに+3を指定すると3行目以降が出力されます。

実行コマンド
tail -n +3 test1.txt
実行結果
3: CCC
4: DDD
5: EEE
6: FFF
7: GGG
8: HHH
9: III
10: JJJ
11: KKK
12: LLL
13: MMM
14: NNN
15: OOO

ファイルの末尾から16文字(改行含む)とファイル名を表示します。
1ファイル指定でもファイル名を明示的に表示する場合は、-vオプションを指定します。

実行コマンド
tail -c 16 -v test1.txt
実行結果
==> test1.txt <==
14: NNN
15: OOO

オプション一覧

head,tailコマンドの各オプションの意味は以下の通りです。

オプション意味
-c出力する文字数を指定する。
-n出力する行数を指定。行数に+を指定すると指定した行以降を取得できる。(tailコマンド)
-qファイル名を非表示にする。
-vファイル名を常に表示する。

指定した範囲の行を取得する

例えば、file.txtの7行目から10行目を取得したい場合、以下のコマンドを使用します。

実行コマンド
tail -n +7 test1.txt | head -n 4
実行結果
7: GGG
8: HHH
9: III
10: JJJ

コマンドの説明

  1. tail -n +7 test1.txttest1.txtの7行目以降をすべて取得。
  2. head -n 4:その出力から先頭の4行を取得(7行目から10行目まで)。

応用例

任意の範囲を取得する関数

スクリプトとして活用する場合、以下の関数を作成すると便利です。
例えば、以下スクリプトをTeraTermなどの端末で直接実行します。

実行スクリプト例
extract_lines() {
local file="$1"
local start="$2"
local end="$3"
tail -n +$start "$file" | head -n $((end - start + 1))
}

使用方法

上記スクリプトを実行後、例えば10行目~13行目を取得したい場合は、以下コマンドを実行します。

実行コマンド
extract_lines test2.txt 10 13
実行結果
10: FFF
11: EEE
12: DDD
13: CCC

これにより、10行目から13行目を簡単に取得できます。
引数の行を変えることで、取得行が変わることもご確認ください。

まとめ

  • tail -n +<開始行> <ファイル>で開始位置を指定します。
  • head -n <取得行数>で範囲を指定します。
  • 関数を作成すると再利用しやすいです。

tailheadコマンドを組み合わせて、効率よくデータを抽出できるようになりましょう!


以上で本記事の解説を終わります。
よいITライフを!
スポンサーリンク
Scroll to Top