`sed` で検索文字列を含む行の行番号だけを出力する方法
はじめに
検索文字列を含む行の 「行番号」 だけを出力させたいときの方法について。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://genzouw.com/wp-content/uploads/2023/01/hyakuninissyu.txt
# 確認
## 先頭の数件を確認
$ head hyakuninissyu.txt
あきのたのかりほのいほのとまをあらみわがころもではつゆにぬれつつ
はるすぎてなつきにけらししろたへのころもほすてふあまのかぐやま
あしびきのやまどりのをのしだりをのながながしよをひとりかもねむ
たごのうらにうちいでてみればしろたへのふじのたかねにゆきはふりつつ
おくやまにもみぢふみわけなくしかのこゑきくときぞあきはかなしき
かささぎのわたせるはしにおくしものしろきをみればよぞふけにける
あまのはらふりさけみればかすがなるみかさのやまにいでしつきかも
わがいほはみやこのたつみしかぞすむよをうぢやまとひとはいふなり
はなのいろはうつりにけりないたづらにわがみよにふるながめせしまに
これやこのゆくもかへるもわかれてはしるもしらぬもあふさかのせき
$ wc -l hyakuninissyu.txt
100 hyakuninissyu.txt
昔からこどもたちと一緒に遊んでいました。
なんとなく「なには」の文字の登場比率が多いと思っていました。
これを含む行を調べてみます。
# 普通は grep で検索します
$ grep 'なには' hyakuninissyu.txt
なにはがたみじかきあしのふしのまもあはでこのよをすぐしてよとや
わびぬればいまはたおなじなにはなるみをつくしてもあはむとぞおもふ
なにはえのあしのかりねのひとよゆゑみをつくしてやこひわたるべき
# sed を使って絞り込むこともできます
$ sed -n '/なには/p' hyakuninissyu.txt
なにはがたみじかきあしのふしのまもあはでこのよをすぐしてよとや
わびぬればいまはたおなじなにはなるみをつくしてもあはむとぞおもふ
なにはえのあしのかりねのひとよゆゑみをつくしてやこひわたるべき
3 件見つかりました。
これらが何行目に登場するのかを調べるには、 grep
が利用できます。
$ grep -n なには hyakuninissyu.txt
19:なにはがたみじかきあしのふしのまもあはでこのよをすぐしてよとや
20:わびぬればいまはたおなじなにはなるみをつくしてもあはむとぞおもふ
88:なにはえのあしのかりねのひとよゆゑみをつくしてやこひわたるべき
ただ、この方法だとファイル名が出力されてしまいます。
「行番号だけ」 が欲しい場合には以下のようなコマンドが利用できます。
$ sed -n '/なには/=' hyakuninissyu.txt
19
20
88
結果が正しいか確認しています。
$ sed -n '19p' hyakuninissyu.txt
なにはがたみじかきあしのふしのまもあはでこのよをすぐしてよとや
$ sed -n '20p' hyakuninissyu.txt
わびぬればいまはたおなじなにはなるみをつくしてもあはむとぞおもふ
$ sed -n '88p' hyakuninissyu.txt
なにはえのあしのかりねのひとよゆゑみをつくしてやこひわたるべき
正しい結果が出力されました。
ディスカッション
コメント一覧
「ひらがなだけの百人一首データ」
https://labo.genzouw.com/2019-07-08/hyakuninissyu.txt
がなく、Googleで検索しましたが見つかりませんでした。
もし、このデータの場所を知っていましたら、教えてほしいです。
よろしくお願いします。
コメントありがとうございます。
おっしゃるとおり、ファイルが消えてしまっていたので改めてアップロードし直しました。
URLが変わっていますのでご注意ください!