なみかわみさきの日記 このページをアンテナに追加 RSSフィード Twitter

2018-02-06

grep正規表現(regex)

はじめに

いまさらこれやってもすでに、ぼうだいな量のドキュメントがあるので、何をいまさらという感じですが。自分の復習つうか自分が喋るならどうやってたかな(昔某所で研修してた気がする)というのを思い出す感じで書いてみます。

対象としては初学者で、本稿(「未経験者にLinuxを教える」)でいうと2回目と3回目の間くらい。3回目でパイプとリダイレクトとかやるような気がするんだけど。


今回のトピック

検索と「grepする」

ググる」はもうGoogleで検索するをとびこえてYahoo!でも「ググる」っていう人がいるらしい。ウェブサイトから、何らかの質問の回答を得たいと思って、あるいは電車の時間を調べるために、ひとは検索する。

一方grep(ぐれっぷ)は、grep(1)*1には”print lines matching a pattern”とあり−−パターンマッチする「行」を「表示」する。

grepの使い方

grepの基本的な使い方は、2種類になるかと思う。

  1. ターゲットファイル内のパターンマッチ
  2. コマンド実行結果のパターンマッチ

下記は1つ目の「ターゲットファイル内のパターンマッチ」について記した。ターゲットファイルの中身は、catというコマンドで表示している。


$ cat ./file1.txt
abcdefghijklmnopqrstuvwxyz
$ grep hoge ./file1.txt
$

(カレントディレクトリ内にある)test1.txt の内部に、「hoge」のパターンを含む行があるかをgrepコマンドで調べ、その結果何もなかったということを示している。

$ cat ./file1.txt
abcdefghijklmnopqrstuvwxyz
$ grep hijk ./file1.txt
$ abcdefghijklmnopqrstuvwxyz
$

hijkはfile1.txtに含まれているため、その行が表示される。(システムによってはhijkの部分に色がつくこともあるだろう。)


「コマンド実行結果のパターンマッチ」は、実務で利用頻度が上がるのではないだろうか。大量のログなどから目的のパターンにあう部分を抜き出す、といった作業でよく使っている。下記の例では、そのままRPMパッケージ数を出すと1484行出力されるが、kernelという文字を含むパッケージだけにしぼって表示している。

$ rpm -qa | wc -l
$ 1484
$ rpm -qa | grep kernel
kernel-xxxxxxxxx
kernel-xxxxxxxxx
kernel-devel-xxxxxxxxx
kernel-devel-xxxxxxxxx
kernel-headers-xxxxxxxxx
kernel-tools-xxxxxxxxx
kernel-tools-xxxxxxxxx
$


オプション有りでの使い方

grepコマンドにはオプションがある。個人的に利用頻度が高いのは、vとiとcあたり。

くさるほど実例を書いたサイトがあるので、ここでは逆引き的にメモしておく。

こうしたい時こうする
hogeって書いてる行は不要grep -v hoge ./targetfile.txt
hogeだけじゃなくてHogeHOGEもとりあえず探すgrep -i hoge ./targetfile.txt
hogeって書いている行をカウントするgrep -c hoge ./targetfile.txt
hogeって書いていない行をカウントするgrep -cv hoge ./targetfile.txt

正規表現とは(ちょっとPerlの世界寄り)

※なんでPerl寄りって書いてるかというと私がPerlから正規表現にふれてたから

grepの後の文字列を、正規表現で記載することにより、さらに(柔軟に)ファイル等から文字列を探すことができる。


$ cat ./file1.txt
abcdefghijklmnopqrstuvwxyz
$ grep 'h.j' ./file1.txt
abcdefghijklmnopqrstuvwxyz
$

「h.j」は「h→何か1文字→j」を示す。よって、「h..j」では結果がないことになる。


$ cat ./file1.txt
abcdefghijklmnopqrstuvwxyz
$ grep 'h..j' ./file1.txt
$

正規表現を勉強するとなるとそれこそ、本にすればフクロウ本レベルになるし、ドキュメントを追うとものすごく広く深くはまっていく。はまるとおもしろい。そのへんは気に入った本やウェブサイトを見てもらうとして、文頭・文末の表現あたりは、見たことがなかったら今見ておいていいかなと思う。詳しくはregex(7)あたり。

  • 文頭→^
  • 文末→$

正規表現で^hogehogeは、「hogeからはじまるか」か、「hogeを含んでいるか」と意味が違ってくる。後者は「hogeからはじまる」も含まれることに注意。

^とか$は、「メタキャラクタ」といって正規表現特別扱いされる。

regex(7)だと

  • ^.[$()|*+?{\

で、Perlの世界では

  • {}[]()^$.|*+?\

がそれに相当する。もし、そのものを文字として、パターンマッチをしたいときは、前に

「半角の¥」を置く。

$ cat file2.txt
abc(def)ghi
$ grep ) ./file2.txt
Too many )'s.

$ grep \) ./file2.txt
abc(def)ghi

マッチする(Perl寄り)

※なんでPerl寄りって書いてるかというと(略)

入門としては「一致する文字列を含む行を出す」くらいでいいと思う。もう一歩すすめるとしたならば、正規表現に「マッチ」しているのはどこか、ということを意識していく必要がある。


参考として、Perlのドキュメント、perlrequick*2に記載されている部分を引用する。

"Hello World" =~ /o/; # matches 'o' in 'Hello'

"That hat is red" =~ /hat/; # matches 'hat' in 'That'

1行目は「oを含む行」で取り出そうとしている。この文章では2回oが出てきて、Perlの世界では先のHelloのoにマッチする。

2行目は、そのルールでいくとThatのhatにマッチということになる。


"cats" =~ /c|ca|cat|cats/; # matches "c"

"cats" =~ /cats|cat|ca|c/; # matches "cats"

これは「cats」という文字列についてだけど、正規表現としてはcでもcaでもcatでもcatsでもマッチする。書き方としては「最初に書いたやつ」が優先されるので、1行目の場合はcでマッチして、2行目の場合はcatsでマッチして、となる。


ワイルドカード #とは

あとよく質問があるのが、「ワイルドカード」との違い。むかしは「また自分で調べておいてね」とかでぼんやりさせてしまってたけど、あらためて見直すと、もっと勉強しないとけないなと思った。のでここにはメモを置いておくので、あとはみなさんで。(結局なげるんかい)


$ ls
fil.txt  file.txt  file3.txt
$ ls | grep "file*"
fil.txt
file.txt
file3.txt
$ ls file*
file.txt  file3.txt

この例は、正規表現file*は

  • filときて
  • eが0回以上の繰り返し
  • を含むもの

なので、fil.txtも、file.txtも、file3.txtも該当するし、

ワイルドカードのfile*は

  • fileときて
  • 任意の数の(文字数の)文字に一致

だから、fil.txtは含まれず、file.txtとfile3.txtが該当することになる。



参考にしたもの

2018-01-28

[]いろいろ思うところがあってWindows8(.1)に戻った件


使ってきた窓について

3.1→95→98→XP→7→8(.1)と10の順。仕事ではNT4→2000→サーバ2003以降とか。


窓10を使っていてつらくなってきた件

インターネット老人会若手なので、だんだん、スマホファーストというか、就職してからキーボードをさわるような世代にあわせた(と思われる)窓10が、使っていてつらくなってきていた。

たぶんごりごりいじったらそれなりにいいはたらきをするんだとは思うけど、そこに学習コストをかける必要もないと思ってきた。

そしてとどめとしては、Homeエディションでは実質、アップデートサービスを止めることができず、どこかのタイミングでアップデートが来たら、パケ死確定*1である。特に大型アップデートについては、ものすごく待たされ、「今すぐ使いたいんだ」という、かんじんな時に使えないことが多くなった。ここ1,2年は、iPodやらでできることも増えてしまい、PC自体を使わなくなっていたというのもある。

現時点での窓の優位点はソフトウェアとプリンタ

それでも思い切ってほかのブランドにしなかったのは、任天堂ハードウェアでないとスーパーマリオができないことと似ている。

私が主に使いたいソフト等は、

であり、プリンターATOKはだいぶん他OSでも対応が増えてきたが、「MIFES一太郎」だけがどうしても叶っていない。−−その昔MIFES一太郎も一応Linux版の扱いはあったんだけどたった今のトレンドLinuxには対応していない−−。


窓8はメインストリームサポート終了している


実はWindows8.1は今年2018年1月9日にメインストリームのサポートが終了している。で、延長サポートは現時点で2023年1月10日なので、まあパッチは出るので、2023年の頃のPC環境も流動的だろうというので、窓8に戻すことにした。



インストール編、いろいろはまった

で、手元の窓10のデスクトップを、8に戻そうとして、持っている8proのメディアでブートしたら、なぜか国とか選ぶ画面のところでハングアップしてしまう。PS2ポートがまずいのかUSBキーボードにしたり、DVIなんどかがまずいのかD-SUBにしたり、別のHDDにしたりとさまざまに試したけどやっぱりだめ。

窓10キャンペーン中に作ってたインストールメディアだとすすめそうなので、たぶんこのバージョンのインストールメディアマザーボードあたりがかみあってないんだなということで、現在マイクロソフトから提供されている窓8.1のメディアを作成した。

Linuxisoはそのものがさっくりダウンロードできる一方で、窓のほうはなんかよくわからんツール(失礼)「メディア作成ツール」経由となる。



そして、これで作成した8.1のメディアで、なんとかインストールは完了した。プロダクトキーは、最初に使ったものが入力できたけど、オンライン認証時にまたごにょごにょあるかもしれない。その時はまたサポートに電話しよう。8Pro購入時のキーをインストール時に入れ、アップデート時にインターネット接続したら、特に問題なくライセンス認証されました。



2020年問題とか2038年問題とか

去年くらいから音声認識スピーカーとか、IoTとかおもろいものも出てきて、あと、ニンテンドーラボのあれとかも、すごい楽しみにしてる。そのなかで、窓7の延長サポートは2020年1月に切れる。某イベントでセキュリティ技術者が足りないとかいうてるのも2020年だったような気がする。あと2年弱で、身の回りの環境はどう変わっていくのか楽しみではある。

*1:現在7GB天井

2018-01-05 今年もよろしくお願いします2018。

[]今年もよろしくお願いします2018。

今年もよろしくお願いします

年始恒例のエントリ、なんと10回目です。


2017年をふりかえる

ちょっと環境が変わりました(見た目にはわからんけどな)。

平日昼間の仕事、病気の経過観察(2つぶん)はあいかわらずです。つぎは6月にCTだったかな。もうひとつのほうは月1回病院行って、薬をもらったかえりに、買い物とかするよゆうはでている。もうすこし薬へらしたくもあり、減らさなくてもいいのかなと思ったり。

イベントまわりとしては、いつものOSC大阪1月、京都8月)と、いくつかのイベントにおじゃましました。

情報処理技術者試験AP応用情報)を春、秋受験。やっぱり勉強不足でほんともうしわけないです(某所にスライディング土下座)。


このマンガがすごい!WEB」さんでもお世話になってまして、去年もけっこうな確率でレビューを載せていただきました。ありがとうございます。自分でもどのくらい載せてもらってるのかそろそろわからなくなってきてて、「なみかわ site:konomanga.jp」とかで(googleで)探してる。



そして、毎年書いてますが、「海のおっちゃんになったぼく」については、ことし12年目になりますね。図書館にほぼ確実にあるのがうれしいです。

ほか2つのブログもよろしくお願いします。

私的少女漫画感想?おもに「りぼん」と「Sho-Comi」作家

ハイテクキッズ・エッセイ2018


2017年ドラクエ

2017年ドラクエ11が発売され、最初スイッチで出ると思うってことでそういうこともあって本体を買いましたけど結局すぐに出なかったので3DS版でクリアしました。感想はゲームブログに書いたけどやっぱりなあ、3がね(略)。

それとほったらかしにしていた9をとりあえずクリアしました。これはリメイクして出していただきたい。せめて配信クエスト全部できる状態にしてほしいところです。

ソーシャルゲームドラクエのいろいろは、絶対に自分の必要な財産を溶かす自身があるので手を出していません。

ことしはWii版で放置だった10についてもうちょいすすめたいところです。あとクリアしてない6,7,8やね。



2017年の「これはすごい」ベスト

はてブでつけた自主的「これはすごい」を紹介したいと思います。


あと英語のページとかは、適度に英和辞典電子辞書のやつ)やGoogle翻訳をつかいながら、拾い読みしてるかんじであり、まだまだリードライトはできないですねぇ。


2018年の予定

大まかな予定です。(年内に適当に更新あり)

  • 1月〜2月
  • 3月
    • 仕事でいろいろある
  • 4月
    • AP試験受けるはず
  • 5月
    • 平日昼間のほうでのなんかのイベントがあったはず
  • 6月
    • 「海のおっちゃんになったぼく」出版から12年
    • このくらいまでにごにょごにょがふがふがあるかも(わからないな)
  • 7月

  • 9月
  • 10月
    • おそらく何かIPA試験受けるらしい
  • 11月
    • KOFのころいつも体調崩すよね


−−今年もよろしくお願いいたします。



-----

  • 関連記事のようなもの