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

Bash

はじめに

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

検証環境

$ 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= というコマンドを利用します。

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

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

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

# データファイルをダウンロード
$ curl -s -O https://labo.genzouw.com/2019-07-08/hyakuninissyu.txt
# 確認
## 先頭の数件を確認
$ head hyakuninissyu.txt
## データファイルの全行数を確認
$ wc -l hyakuninissyu.txt

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

$ sed -n '/なには/p' hyakuninissyu.txt
なにはえのあしのかりねのひとよゆゑ みをつくしてやこひわたるへき
なにはかたみしかきあしのふしのまも あはてこのよをすくしてよとや
わひぬれはいまはたおなしなにはなる みをつくしてもあはむとそおもふ

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

$ grep -n なには hyakuninissyu.txt
43:なにはえのあしのかりねのひとよゆゑ みをつくしてやこひわたるへき
44:なにはかたみしかきあしのふしのまも あはてこのよをすくしてよとや
97:わひぬれはいまはたおなしなにはなる みをつくしてもあはむとそおもふ

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

$ sed -n '/なには/=' hyakuninissyu.txt
43
44
97

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

$ sed -n '43p' hyakuninissyu.txt
なにはえのあしのかりねのひとよゆゑ みをつくしてやこひわたるへき
$ sed -n '44p' hyakuninissyu.txt
なにはかたみしかきあしのふしのまも あはてこのよをすくしてよとや
$ sed -n '97p' hyakuninissyu.txt
わひぬれはいまはたおなしなにはなる みをつくしてもあはむとそおもふ

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

Bash