1. 概要

Linuxでは、入力ファイルからテキストの一部を取得するのが一般的な操作です。

入力からテキストの一部を出力するための2つの基本的で広く使用されているコマンドラインユーティリティがあります。headコマンドとtailコマンドです。

このチュートリアルでは、例を通じてこれら2つのコマンドの一般的な使用法について説明します。

2. ヘッドおよびテールコマンドの概要

headコマンドとtailコマンドはどちらも、 GNU coreutilsパッケージのメンバーです。 デフォルトでは、すべてのLinuxディストリビューションにインストールされています。

名前が示すように、 headコマンドはファイルの最初の部分を出力し、tailコマンドはファイルの最後の部分を出力します。どちらのコマンドも結果を標準出力に書き込みます。

後のセクションでは、各コマンドを詳しく見て、例を通してそれらの使用方法を学びます。

3. headコマンド

headコマンドの構文は非常に単純です。

head [OPTIONS] FILES

コマンドをよりよく理解するために、入力例としてファイル( numbers_en.txt )を準備しましょう。

$ cat numbers_en.txt
one           : 1
two           : 2
three         : 3
four          : 4
...
ninety-seven  : 97
ninety-eight  : 98
ninety-nine   : 99
one hundred   : 100

このファイルには、1から100までの数字の英語の単語が含まれています。 したがって、ファイルには100行あります。

head コマンドは、デフォルトで、入力ファイルの最初の10行を標準出力に書き込みます。

$ head numbers_en.txt
one           : 1
two           : 2
three         : 3
four          : 4
five          : 5
six           : 6
seven         : 7
eight         : 8
nine          : 9
ten           : 10

3.1. 特定の行数を出力する

-nオプションを使用すると、デフォルトの10 の代わりに、headコマンドに最初のn行を出力させることができます。

たとえば、最初の7行を標準出力に出力する場合は、 -n7を使用します。

$ head -n 7 numbers_en.txt
one           : 1
two           : 2
three         : 3
four          : 4
five          : 5
six           : 6
seven         : 7

-n オプションをに続く番号と一緒に渡すと、たとえば -n -x の場合、headコマンドは次のようになります。 ファイルの最後のx行を除くすべての行を出力します。 

たとえば、ファイルの最後の97行を無視する場合は、 -n-97を実行します。

$ head -n -97 numbers_en.txt
one           : 1
two           : 2
three         : 3

3.2. 特定のバイト数を出力する

headコマンドは、テキストを1行ずつ表示するだけでなく、-cオプションを渡すと、ファイルの内容をバイト単位で出力することもできます。

-c オプションの使用法は、テキストを行単位ではなくバイト単位で表示することを除いて、-nオプションと同じです。

ファイルの最初の単語「1」(3バイト)のみを表示する例を見てみましょう。

$ head -c 3 numbers_en.txt
one

3.3. 複数のファイルを出力する

headコマンドは複数のファイルを処理することもできます。 これを確認するために、最初に別の入力ファイルnumbers_de.txtを準備しましょう。 このファイルはnumbers_en.txtと非常によく似ています。唯一の違いは、ファイル内の単語が英語ではなくドイツ語であるということです。

$ cat numbers_de.txt
eins             : 1
zwei             : 2
drei             : 3
vier             : 4
...
siebenundneunzig : 97
achtundneunzig   : 98
neunundneunzig   : 99
(ein)hundert     : 100

次に、両方のファイルの最初の5行を1回のショットで出力しましょう。

$ head -n 5 numbers_en.txt  numbers_de.txt
==> numbers_en.txt <==
one           : 1
two           : 2
three         : 3
four          : 4
five          : 5

==> numbers_de.txt <==
eins             : 1
zwei             : 2
drei             : 3
vier             : 4
fünf             : 5

4. tailコマンド

tailコマンドを使用する構文も非常に簡単です。

tail [OPTIONS] FILES

tail コマンドは、デフォルトで入力ファイルの最後の10行を標準出力に書き込みます。

$ tail numbers_en.txt 
ninety-one    : 91
ninety-two    : 92
ninety-three  : 93
ninety-four   : 94
ninety-five   : 95
ninety-six    : 96
ninety-seven  : 97
ninety-eight  : 98
ninety-nine   : 99
one hundred   : 100

4.1. 特定の行数を出力する

-nオプションを使用すると、デフォルトの10 の代わりに、tailコマンドに最後のn行を出力させることができます。

この例は、入力ファイルから最後の7行を取得する方法を示しています。

$ tail -n 7 numbers_en.txt
ninety-four   : 94
ninety-five   : 95
ninety-six    : 96
ninety-seven  : 97
ninety-eight  : 98
ninety-nine   : 99
one hundred   : 100

-n オプションを「+」に続く数字と一緒に渡すと、たとえば「 -n + x」の場合、tailコマンドは x-th行からファイルの終わりまで印刷します。

95行目からnumbers_en.txtファイルの最後まで印刷してみましょう。

$ tail -n +95 numbers_en.txt
ninety-five   : 95
ninety-six    : 96
ninety-seven  : 97
ninety-eight  : 98
ninety-nine   : 99
one hundred   : 100

4.2. 特定のバイト数を出力する

head コマンドと同様に、-cxオプションをtailコマンドに渡すと、最後のxバイトのみが出力されます。入力ファイル。

入力ファイルから最後の番号100を取得しましょう。

$ tail -c 4 numbers_en.txt
100

上記の例では、-cオプションに3ではなく4を渡しました。 これは、最後の行に終了改行があり、この改行が1バイトを占めていたためです。

4.3. 複数のファイルを出力する

head コマンドと同様に、tailコマンドも複数の入力ファイルから出力できます。

2つの入力ファイルから最後の5行を印刷する例を見てみましょう。

$ tail -n 5 numbers_en.txt numbers_de.txt 
==> numbers_en.txt <==
ninety-six    : 96
ninety-seven  : 97
ninety-eight  : 98
ninety-nine   : 99
one hundred   : 100 

==> numbers_de.txt <==
sechsundneunzig  : 96
siebenundneunzig : 97
achtundneunzig   : 98
neunundneunzig   : 99
(ein)hundert     : 100

4.4. 変更のファイルを見る

チェックしたい入力ファイルが変更されている場合があります。 たとえば、実行中のアプリケーションがその出力をログファイルに追加する場合があります。

変更するファイルに対して-fオプションを指定してtailコマンドを実行すると、新しく追加されたすべての行が標準出力に追加されます。

次に、この機能のデモンストレーションを見てみましょう。

まず、簡単なシェルスクリプトappend_ts.shを作成します。毎秒、現在のタイムスタンプをログファイル( /tmp/timestamp.log)に追加します。ログファイルを10回:

$ cat ./append_ts.sh
#!/bin/bash
for times in {1..10}
do
    echo $(date) >> /tmp/timestamp.log
    times=$(($times+1))
    sleep 1
done

次に、 tail コマンドでログファイルの監視を開始し、上記のスクリプトを実行して、新しく追加されたタイムスタンプがtailの出力に到達するかどうかを確認します。

予想通り、新しく追加された行はすべて印刷されます。

tail コマンドを終了するには、Ctrl-Cを押します。

5. ヘッドテールを一緒に使用する

head コマンドはファイルの最初の部分を提供し、tailコマンドは入力ファイルの最後の部分を出力できることを学びました。 しかし、ファイルの途中で一部を取得したい場合はどうでしょうか。

この問題を解決するために、2つの簡単なコマンドを組み合わせることができます。

入力ファイルから51行目から55行目までを取得したいとします。

$ tail -n +51 numbers_en.txt | head -n 5
fifty-one     : 51
fifty-two     : 52
fifty-three   : 53
fifty-four    : 54
fifty-five    : 55

headコマンドとtailコマンドを別の方法で組み合わせても、同じ出力を得ることができます。

$ head -n 55 numbers_en.txt | tail -n 5

6. 結論

ヘッドテールは、2つのシンプルでわかりやすいLinuxコマンドラインユーティリティです。

この記事では、例を通して両方のコマンドのいくつかの典型的な使用法を学びました。

2つのコマンドを適切に使用すると、入力ファイルの一部を簡単に取得して、さらに処理することができます。