head と tail の行数指定方法
2012.09.22
head と tail を使うとき、行数指定方法について。動作確認は GNU coreutils 8.19 で行っている。
head と tail のは-n 数字
(あるいは--line 数字
)で出力する行数を指定できる。
# 先頭3行を表示
$ seq 10 | head -n 3
1
2
3
# 末尾3行を表示
$ seq 10 | tail -n 3
8
9
10
オプションで与える数字には、プラスがつく場合、マイナスがつく場合、何もつかない場合が考えられるが、記号がついた場合に通常異なる挙動をとる場合が出てくる。
head -n -数字
の場合は、「末尾から指定した行数を除いたもの」となる:
$ seq 10 | head -n -3
1
2
3
4
5
6
7
tail -n +数字
の場合は、「先頭から数えて指定した行以降のもの」となる:
$ seq 10 | tail -n +3
3
4
5
6
7
8
9
10
まとめると以下の通り:
指定行数を除いて表示 先頭から
指定行数表示 先頭から
指定行数表示 tail 先頭から
指定行数以降を表示 末尾から
指定行数表示 先頭から
数えて指定した行以降表示
-n 数字
の代わりに -数字
で指定することもできるけど、-n のオプションで負数を指定しているときと混同するのでやめた方がいい。
-
や +
オプションは境界値がどうなっているか忘れがちだし、これが必要となるような局面では awk
を使った方が直感的に表現できる。
# 3行目から5行目を表示
$ seq 10 | awk 3<=NR && NR<=5
3
4
5