シェルスクリプトでファイルや標準入力の先頭行、末尾行を除去する方法

Bash

はじめに

時間がないので今日は小ネタにしておきます。

シェルスクリプトで標準入力で受け取った情報の先頭行や末尾行を削る方法について。

検証環境

$ uname -moi
x86_64 MacBookPro10,1 Darwin

$ bash -version
GNU bash, バージョン 5.0.3(1)-release (x86_64-apple-darwin18.2.0)

標準入力として渡すデータ

seq コマンドを使って、 1〜10 の数値を渡して、先頭の 1 と 末尾の 10 を削ってみます。

$ seq 1 10
1       << ※ここを削除
2
3
4
5
6
7
8
9
10      << ※ここを削除

tail を使う方法

tail はファイルや標準入力の末尾から数えて何行目を出力、というように使うケースが多いですが、「何行目以降をすべて出力」という場合にも利用できます。-n + という変わったオプションを利用します。

# 2行目以降をすべて出力
$ seq 1 10 | tail -n +2
2
3
4
5
6
7
8
9
10

あとはhaedと組み合わせて、8行出力させればOKです。

$ seq 1 10 | tail -n +2 | head -n +8
2
3
4
5
6
7
8
9

sed を使う方法

先の例では、 head コマンドを使っている部分が汎用的ではありませんね。
出力行数が増えた場合、適切に-n オプションの引数の値を変更してやる必要があります。

sed を使うともっとシンプルにかけます。( 参考 : sedコマンドを全行に実行させたくない場合は内部コマンドの適用範囲を指定しよう(含む、含まない、特定の行のみ、数行毎に、など) )

# 1行目と末尾をsedのdコマンドを使って削除
$ seq 1 10 | sed '1d; $d;'
2
3
4
5
6
7
8
9

ひとこと

CSVのヘッダー行を取り除く場合や、末尾の集計行を取り除く場合に便利でよく使います。

Bash