
スポンサーリンク
headコマンドおよびtailコマンドで、ファイルの先頭・末尾を表示する方法を説明します。
またLinuxのtail
とhead
コマンドを組み合わせることで、ファイルの特定の範囲の行を取得することができます。
本記事では、その方法を詳しく解説します。
使用サンプルファイル
以下サンプルファイルを使用して説明します。
$ cat test1.txt1: AAA2: BBB3: CCC4: DDD5: EEE6: FFF7: GGG8: HHH9: III10: JJJ11: KKK12: LLL13: MMM14: NNN15: OOO
$ cat test2.txt1: OOO2: NNN3: MMM4: LLL5: KKK6: JJJ7: III8: HHH9: GGG10: FFF11: EEE12: DDD13: CCC14: BBB15: AAA
ファイルの先頭を表示(head)
ファイルの先頭を表示する際は、headコマンドを利用します。
headコマンドの構文
ファイルの先頭を表示する(10行)
head [ファイル名]
ファイルの先頭から3行表示する
head -n 3 [ファイル名]
ファイルの先頭から12文字表示する
head -c 12 [ファイル名]
headコマンド実行例
ファイルの先頭から10行を表示します。
head test1.txt
オプションを指定しなければ、デフォルトで10行出力されます。
1: AAA2: BBB3: CCC4: DDD5: EEE6: FFF7: GGG8: HHH9: III10: JJJ
ファイルの先頭から3行を表示します。
head -n 3 test1.txt
-n
オプション指定で3行が出力されます。
1: AAA2: BBB3: CCC
複数ファイルの先頭から3行ずつを表示します。
head -n 3 test1.txt test2.txt
複数ファイルの場合は、ファイル名を含んで出力します。
==> test1.txt <==1: AAA2: BBB3: CCC
==> test2.txt <==1: OOO2: NNN3: MMM
複数ファイルの先頭から3行ずつを表示します。(ファイル名を含まない)
head -n 3 -q test1.txt test2.txt
-q
オプションでファイル名が非表示になります。
1: AAA2: BBB3: CCC1: OOO2: NNN3: MMM
ファイルの先頭から14文字(改行含む)+ファイル名を表示する。
head -c 14 -v test1.txt
1ファイル指定でもファイル名を明示的に表示する場合は、-v
オプションを指定します。
==> test1.txt <==1: AAA2: 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: FFF7: GGG8: HHH9: III10: JJJ11: KKK12: LLL13: MMM14: NNN15: OOO
ファイルの末尾から3行を表示します。
tail -n 3 test1.txt
-n
オプション指定で3行出力されます。
13: MMM14: NNN15: OOO
複数ファイルの末尾から3行ずつを表示します。
tail -n 3 test1.txt test2.txt
複数ファイルの場合、ファイル名を含んで出力します。
==> test1.txt <==13: MMM14: NNN15: OOO
==> test2.txt <==13: CCC14: BBB15: AAA
複数ファイルの末尾から3行ずつを表示します。(ファイル名を含まない)
tail -n 3 -q test1.txt test2.txt
-q
オプションでファイル名が非表示になります。
13: MMM14: NNN15: OOO13: CCC14: BBB15: AAA
ファイルの3行目から末尾までを表示します。
-n
オプションに+3
を指定すると3行目以降が出力されます。
tail -n +3 test1.txt
3: CCC4: DDD5: EEE6: FFF7: GGG8: HHH9: III10: JJJ11: KKK12: LLL13: MMM14: NNN15: OOO
ファイルの末尾から16文字(改行含む)とファイル名を表示します。
1ファイル指定でもファイル名を明示的に表示する場合は、-v
オプションを指定します。
tail -c 16 -v test1.txt
==> test1.txt <==14: NNN15: OOO
オプション一覧
head,tailコマンドの各オプションの意味は以下の通りです。
オプション | 意味 |
---|---|
-c | 出力する文字数を指定する。 |
-n | 出力する行数を指定。行数に+を指定すると指定した行以降を取得できる。(tailコマンド) |
-q | ファイル名を非表示にする。 |
-v | ファイル名を常に表示する。 |
指定した範囲の行を取得する
例えば、file.txt
の7行目から10行目を取得したい場合、以下のコマンドを使用します。
tail -n +7 test1.txt | head -n 4
7: GGG8: HHH9: III10: JJJ
コマンドの説明
tail -n +7 test1.txt
:test1.txt
の7行目以降をすべて取得。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: FFF11: EEE12: DDD13: CCC
これにより、10行目から13行目を簡単に取得できます。
引数の行を変えることで、取得行が変わることもご確認ください。
まとめ
tail -n +<開始行> <ファイル>
で開始位置を指定します。head -n <取得行数>
で範囲を指定します。- 関数を作成すると再利用しやすいです。
tail
とhead
コマンドを組み合わせて、効率よくデータを抽出できるようになりましょう!
以上で本記事の解説を終わります。
よいITライフを!