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.txt1ファイル指定でもファイル名を明示的に表示する場合は、-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.txt3: 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 47: 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 1310: FFF11: EEE12: DDD13: CCCこれにより、10行目から13行目を簡単に取得できます。
引数の行を変えることで、取得行が変わることもご確認ください。
まとめ
tail -n +<開始行> <ファイル>で開始位置を指定します。head -n <取得行数>で範囲を指定します。- 関数を作成すると再利用しやすいです。
tailとheadコマンドを組み合わせて、効率よくデータを抽出できるようになりましょう!
Linuxユーザにお勧めの本
以上で本記事の解説を終わります。
よいITライフを!