`sed` で検索文字列を含む行の行番号だけを出力する方法

はじめに

検索文字列を含む行の 「行番号」 だけを出力させたいときの方法について。 sed を使って実現できます。

検証環境

1
2
3
4
5
$ uname -moi
x86_64 MacBookPro11,4 Darwin

$ bash -version | head -n 1
GNU bash, バージョン 5.0.7(1)-release (x86_64-apple-darwin18.5.0)

sed=内部コマンド を利用する

sed= というコマンドを利用します。

このコマンドは非常にシンプルなものであまり使いみちがないと思っていたのですが、検索した結果の「行番号」を取得したいケースがあり、その時だけ活用できました。

早速試してみます。 百人一首のなかから特定も文字列を含む行の行番号だけをピックアップしてみます。

以下のコマンドでひらがなだけの百人一首データをダウンロードします。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# データファイルをダウンロード
$ curl -s -O /wp-content/uploads/2023/01/hyakuninissyu.txt

# 確認
## 先頭の数件を確認
$ head hyakuninissyu.txt
あきのたのかりほのいほのとまをあらみわがころもではつゆにぬれつつ
はるすぎてなつきにけらししろたへのころもほすてふあまのかぐやま
あしびきのやまどりのをのしだりをのながながしよをひとりかもねむ
たごのうらにうちいでてみればしろたへのふじのたかねにゆきはふりつつ
おくやまにもみぢふみわけなくしかのこゑきくときぞあきはかなしき
かささぎのわたせるはしにおくしものしろきをみればよぞふけにける
あまのはらふりさけみればかすがなるみかさのやまにいでしつきかも
わがいほはみやこのたつみしかぞすむよをうぢやまとひとはいふなり
はなのいろはうつりにけりないたづらにわがみよにふるながめせしまに
これやこのゆくもかへるもわかれてはしるもしらぬもあふさかのせき

$ wc -l hyakuninissyu.txt
100 hyakuninissyu.txt

昔からこどもたちと一緒に遊んでいました。 なんとなく「なには」の文字の登場比率が多いと思っていました。 これを含む行を調べてみます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 普通は grep で検索します
$ grep 'なには' hyakuninissyu.txt
なにはがたみじかきあしのふしのまもあはでこのよをすぐしてよとや
わびぬればいまはたおなじなにはなるみをつくしてもあはむとぞおもふ
なにはえのあしのかりねのひとよゆゑみをつくしてやこひわたるべき

# sed を使って絞り込むこともできます
$ sed -n '/なには/p' hyakuninissyu.txt
なにはがたみじかきあしのふしのまもあはでこのよをすぐしてよとや
わびぬればいまはたおなじなにはなるみをつくしてもあはむとぞおもふ
なにはえのあしのかりねのひとよゆゑみをつくしてやこひわたるべき

3 件見つかりました。 これらが何行目に登場するのかを調べるには、 grep が利用できます。

1
2
3
4
$ grep -n なには hyakuninissyu.txt
19:なにはがたみじかきあしのふしのまもあはでこのよをすぐしてよとや
20:わびぬればいまはたおなじなにはなるみをつくしてもあはむとぞおもふ
88:なにはえのあしのかりねのひとよゆゑみをつくしてやこひわたるべき

ただ、この方法だとファイル名が出力されてしまいます。 「行番号だけ」 が欲しい場合には以下のようなコマンドが利用できます。

1
2
3
4
$ sed -n '/なには/=' hyakuninissyu.txt
19
20
88

結果が正しいか確認しています。

1
2
3
4
5
6
7
8
$ sed -n '19p' hyakuninissyu.txt
なにはがたみじかきあしのふしのまもあはでこのよをすぐしてよとや

$ sed -n '20p' hyakuninissyu.txt
わびぬればいまはたおなじなにはなるみをつくしてもあはむとぞおもふ

$ sed -n '88p' hyakuninissyu.txt
なにはえのあしのかりねのひとよゆゑみをつくしてやこひわたるべき

正しい結果が出力されました。