grep、sed、awkを使いこなすLinuxコマンド勉強会
はじめに
WSLの登場により、LinuxコマンドがWindowsでも手軽に使えるようになりました。 今回は、使いこなせると便利なgrep、sed、awkコマンドをちゃんと使いこなせるようになりたいというモチベーションで取り組んでいきます。特に正規表現を使った処理が強力で、様々な分野で活用できるため、理解を深めていきたいです。
さぁやっていきましょう。
似たような言葉を良い感じに置換する(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コマンド勉強会を続けていき、grep、sed、awkコマンドを使いこなせるようになることを目指していきます。
しばらく、このLinuxコマンド勉強会は続けていきたいと思います。