Linuxコマンド学習会(grep , sed, 拡張正規表現、後方参照)

2021-10-20

はじめに

WSLの登場により、LinuxコマンドがWindowsでも手軽に使えるようになりました。

今回は、使いこなせると便利なgrepと、sedと、awkをちゃんと使いこなせるようになりたいなってモチベーションでやっていきましょう。

ネットワーク・インフラとかやってるサーバ屋さんは詳しい人たくさんいるイメージです。 Webアプリケーションを扱う人たちも使うことはあると思います。 組み込み系の人(私)は、あまり使う機会無いのかしら・・・って感じですね。昔から開発やってきたベテランの中には詳しい人いる印象です。

ただ、後輩、同期で新しく始めようって人はいない? 少なくとも観測できる周りでは見ない印象です。

みんながやってることやっても上位互換沢山いて困るので、ニッチに生きていきたいと思います。(この手の話はもうすでにみんな履修済みなんだろうか・・・置いてけぼりなだけの気もするが・・・)

さぁやっていきましょう

 似たような言葉を良い感じに置換する(sed)

似たような言葉の羅列といえば、化学物質ですよね。

既存化学物質毒性データベース

今回の例題として「テトラヒドロフルフリルアルコール」を使いましょう。 ちなみにこの物質の用途としては 「染料溶剤、ゼラチン溶液安定剤、漂白用の湿潤剤、可塑剤、防カビ剤、塗料、ジヒドロピラン原料、合成医薬品中間体原料」があるようです。 価格帯としては500mlで2700円ぐらいだそうです。

基本的な使い方はこんな感じです。

sed 's/変換する文字/変換後の文字/'

こんな感じに使えます。

echo "テトラヒドロフルフリルアルコール" |sed 's/ル/ラ'
テトラヒドロフラフリルアルコール

何も付けなければ左から最初にマッチした言葉だけを変換するが、 末尾を/gで終わるようにすると、該当する全てを変換します。

echo "テトラヒドロフルフリルアルコール" |sed 's/ル/ラ/g'
テトラヒドロフラフリラアラコーラ

拡張正規表現と後方参照

検索した結果を検索した文字列で置き換えたいッてニーズがあって しかも、1回目に引っ掛けた文字、2回目に引っ掛けた文字…それぞれを使いたい場合に使用できます。

echo "テトラヒドロフルフリルアルコール" |sed -E 's/(ヒ..)(.....)(.....)/\1/'
テトラヒドロ

echo "テトラヒドロフルフリルアルコール" |sed -E 's/(ヒ..)(.....)(.....)/\2'
テトラフルフリル

echo "テトラヒドロフルフリルアルコール" |sed -E 's/(ヒ..)(.....)(.....)/\3/'
テトラアルコール

「.」が任意の一文字を表しています。 「ヒ..」でヒから始まる三文字の言葉を抜き出しています。 上の例だとヒドロが出ますね。

その後に続く(…..)(…..)というのは何かというと(ヒ..)から検索してその後の単語を引っ掛けています。

/移行に書いている、変換後の値に \2 とか数字を入れているのは、この()で記載していた所を後で使えるようにしているイメージです。 並びとしてはこんな漢字ですかね。「(1)(2)(3)」

この再利用できる仕組みを後方参照と言います。-Eはこの後方参照に対応した正規表現である拡張正規表現に対応したものを使いますっていう宣言みたいなものです。

この書き方をすれば特定の単語同士を入れ替えて出力するみたいなことが簡単に実現できます。

echo "テトラヒドロフルフリルアルコール" |sed -E 's/(ヒ..)(.....)(.....)/\3\2\1/'
テトラアルコールフルフリルヒドロ

このツイートからジョイマンが何回言われているのか数える (grep)

ちょっとした例題風にやってみましょう。

以下のツイートに「ジョイマン」という単語が何回出てきているか。 (@joymanjoyman)

回答案

grepでマッチする部分だけを取り出す、-oを付けて実行しています。 今回は単語の抜き出しだったのでwcコマンドを使い単語数を数えています。

echo 'クイズ番組で「このコンビの名前は?」と僕達の写真付きで出題されて誰も覚えていなかったらしいです。誰かジョイマンを覚えている
人はいませんか。本当に、2008年、ジョイマンは本当に存在していたのでしょうか。そして今ジョイマンは存在しているのでしょうか。正直、答えはもう僕
にも分かりません'|grep -o 'ジョイマン'|wc -w

実行結果はこれが得られます。

3

まとめ

正規表現はPythonとか他の言語でも扱える汎用的なものですので、ぜひとも覚えておきたい。 正規表現電話番号とかメールアドレスを抜き出したりには使ったことあるけど、拡張正規表現まで使っって何かしたこと無いな。 何かサクッと作りたい時とかに役立ちそうな手応えを感じます。

しばらく、このLinuxコマンド勉強会は続けていきたいと思います。