36テキスト処理(文字列の検索)



基本形 テキストファイルから正規表現を使用したパターンにマッチした行を表示する

grep [オプション] 文字列 [ファイルのパス] 


-c  マッチした行数を表示する

-i  英大文字と小文字を区別しない

-n  元のファイルの行番号を表示する

-r  ディレクトリ以下すべてのファイルを再起的に検索する

-v  マッチしなかった行を表示する


grepは標準入力からリダイレクション可能である





myFile.txtから出身地が「東京」の人を検索





myFile.txtから出身地が「東京」以外の人を検索




myFile.txtに性別が「男」の人は何人いるでしょうか?


6人いるようです。




AND検索

オプションは用意されていないので2つのgrepコマンドを|でつなげます


【問題36ー1】

①myFile.txtに性別が「女」で出身地が「千葉」以外の人は何人いるかカウントするコマンドを構成してください  p.89

[guest@icv99 ~]$ ●●●●●●●●●
2
[guest@icv99 ~]$


実行コマンドと実行結果をファイル
Question361.txt
に保存して、提出サーバへ送信すること。


OR検索

-e オプションを複数回指定することでor検索が可能である



myFile.txtで出身地が東京もしくは埼玉の人を表示する



【問題36-2】

②myFile.txtで出身地が「千葉」または「群馬」の人を年齢順に並び替えるコマンドを構成してください  p.89

[guest@icv99 ~]$ ●●●●●●●●●●●●●●
桜田ひとみ:女:15:千葉
小森紀幸:男:43:千葉
江藤淳子:女:48:群馬
[guest@icv99 ~]$


実行コマンドと実行結果をファイル
Question362.txt
に保存して、提出サーバへ送信すること。


最後にgrepを使ってユーザ情報を確認してみたいと思います。

ユーザ情報は /etc/passwd ファイルに格納されています。

一般ユーザはuidに500番以降が割り当てられています(ファイルの形式は別途説明します)。






簡単・便利なgrep(1)の使い方

grep(1)は、フィルタという言葉そのままのコマンドだ。引数にパターンを与えると、そのパターンに一致したデータのみを出力する。-vオプションを指定すると、逆にパターンに一致したデータのみを出力させないといったこともできる。
データの抜き出しは、デフォルトでは行単位となっている。最も簡単な例としては、「ログデータをチェックして、『ERROR』という文字列が含まれている行のみを取り出す」といった使い方が考えられるだろう。例えば、こんな感じだ。

cat /var/log/《何らかのログデータ》 | grep ERROR
grep(1)コマンドに指定できるパターンには、「正規表現」と呼ばれる表記を使用できる。これが魔法の呪文のようで慣れるまでは一苦労なのだが、使いこなせばさまざまな条件を表現できるため、かゆいところに手が届くような指定を行えるようになる。
正規表現を全て正確に覚えるのは大変なので、よく使う記述の中で、覚えやすいものだけ覚えておけばよいと思う。今回は、最も簡単な指定方法を紹介しておく。まずはこのあたりは使えるようになっておこう。

覚えておきたい正規表現

grep(1)の最もシンプルな使い方は、「指定したキーワードを含む行を表示させる」というものだ。grep(1)の引数に、キーワード(パターン)を指定して実行するだけでよい。-vオプションを指定すると、逆にそのキーワード(パターン)を含む行を表示しないようになる。この2つは、基本中の基本だ。

コマンド
意味
grep PATTERN
PATTERNが含まれている行を表示
grep -v PATTERN
PATTERNが含まれていない行を表示
grep ^PATTERN
行の先頭がPATTERNになっている行を表示
grep PATTERN$
行の末尾がPATTERNになっている行を表示
grep -v ^$
空行を削除

もう1つ覚えておきたいのが、行頭を表現する「^」と、行末を表現する「$」だ。指定するキーワード(パターン)を「^PATTERN」のように指定すれば、行頭がその文字列(この場合、PATTERN)になっている行がヒットする。一方、「PATTERN$」と指定すれば、行末がこのキーワード(パターン)になっているものに一致する。ということは、「^$」と指定すれば空行を指定しているのと同じことになる。
「^」と「$」を覚えるだけでも、grep(1)でできることは飛躍的に増加する。ログファイルのみならず、ほかのコマンドの出力結果を絞り込む場合などにも便利だ。
例えば、ls(1)コマンドは「ls -l」のように実行するとファイルやディレクトリの一覧を詳細表示させることができる。このls(1)コマンドの出力結果をディレクトリのみに絞り込みたい場合、ls(1)コマンドの出力結果をgrep(1)に流し込み、「grep ^d」のように指定して実行すればよい。行頭や行末で絞り込むことができるケースは結構多いので、まずこの指定方法は覚えておきたい。
今回覚えておいてほしいのはgrep(1)、-v、「^」、「$」だ。これらを組み合わせるだけでもさまざまなフィルタリングが可能になる。ぜひ試してみていただきたい。