fc2ブログ

正規表現で grep 検索を便利に その5

引き続き、正規表現です

正規表現にはメタキャラがあります

主なものとして

^
行の始まり


行末

.
任意の1文字

*
直前の正規表現
もしくは
0回以上の繰り返し

[文字列]
いずれかの文字
例:[abc]
ならa か b か c になる

[^文字列]
この文字列以外の文字
例:[^abc]
ならabc を含まない行をしめす

\b
単語の区切り

\<
単語のはじまり

\>
単語の終わり

\w
すべての英数字
[[:alnum:]]
と同じ意味になる

\W
すべての英数字以外
[^[:alnum:]]
と同じ意味

というようになります

一番使えそうなのが、みたところ単語なのですが
この単語とは
スペースや Tab , ; などで区切られた文字列なので
なれないと使い勝手はよくありません

試しに、FTPサーバー構築のために、ファイルを grep で調べてみたのですが
grep "\" /etc/vsftpd/vsftpd.conf

anonymous_enable=YES
local_enable=YES
write_enable=YES
#anon_upload_enable=YES
#anon_mkdir_write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
#chown_uploads=YES
xferlog_std_format=YES
#async_abor_enable=YES
#ascii_upload_enable=YES
#ascii_download_enable=YES
#deny_email_enable=YES
# directory. If chroot_local_user is YES, then this list becomes a list of
#chroot_local_user=YES
#chroot_list_enable=YES
#ls_recurse_enable=YES
listen=YES
#listen_ipv6=YES
userlist_enable=YES
tcp_wrappers=YES

としてYESを含む単語はでますが

ascii の単語を含む行をだそうとしてもでませんでした

また、単語で調べるときには、日本語だとうまく動作しないようです

スポンサーサイト



テーマ : Linux
ジャンル : コンピュータ

正規表現で grep 検索を便利に その4

今回は、メタキャラをつかってみようと思います

とくに一番使う * を使ってみます

* は端末で一番使うことが多いと思います

例えば grep *.txt
として .txt の拡張子のものを調べたりといろいろ活用できます

ただし、正規表現になると意味が変わっていますので要注意です

^が行頭だったのに、正規表現にしたら 否定になっているように

*も、~を含むすべて、というような意味合いから
正規表現では
直前の文字、もしくは0回以上のパターンの繰り返し
という意味になっています

0回もカウントしてしまうので、空文字も含みます

まずは、わかりやすく、サンプルを用意しましょう

vi sample.txt
でファイルを作成し

内容を
aa lx
laaaax
lbx 13
11 lax
345
4444456
laas
lbbx

という内容にします


この中から、l で始まりaの繰り返しが何個からあり
最後はx で終わるものを検索するには
grep "laa*x" sample.txt
とします

結果は
laaaax
11 lax
となります

間違えて
grep "la*x" sample.txt
とすると、空白入りの行がでてきます

この応用で、数字だけの行をだせます
grep "^[0-9][0-9]*$" sample.txt
これで
345
4444456
となります

. と * を組み合わせて任意の文字列とマッチさせるというのが
よく使われるそうです

ただし、1個以上の任意の文字列にするなら
.*
ではなく
..*
としますのでご注意

テーマ : Linux
ジャンル : コンピュータ

正規表現で grep 検索を便利に その3

サーバー設定に便利になりそうだったので、
正規表現をあれこれやっていますが

文字クラスの範囲指定が思いつかないので
日経Linux 2011-03 の記事を参考にします

そして、今回はサンプルファイルとして、costomer.txt
というファイルを使います

内容は
1:山田太郎:男:43:東京
2:井上直子:女:19:埼玉
3:山本真一:男:43:福岡
4:千葉信夫:男:16:東京
5:秋山敬一郎:男:44:秋田

101:藤本信:男:40:東京
102:加藤純子:女:35:千葉
103:福岡勲:男:41:香川
104:桂井昭宏:男:53:福岡
というものです

ここから、東京に住んでいる人だけを調べます
grep ":[東].$" costomer.txt
これを実行すると
1:山田太郎:男:43:東京
4:千葉信夫:男:16:東京
101:藤本信:男:40:東京

となります

$ は行末、そして . は任意の文字数になります
今回は :[東].$ なので、
意味は行末より2つ左の文字で、東を含むものを検索するという意味になります

また、通常は ^ は行頭を意味しますが
[] の中に記述すると、~でないという意味になります

例えば
grep ":[^東].$" costomer.txt
とすると、
2:井上直子:女:19:埼玉
3:山本真一:男:43:福岡
5:秋山敬一郎:男:44:秋田
102:加藤純子:女:35:千葉
103:福岡勲:男:41:香川
104:桂井昭宏:男:53:福岡

というように、東京に住んでいない人がでます


また、年齢で検索するという場合には
grep ":[3][0-9]:" costomer.txt
とすることで、30代の人を割り出すこともできます
最初の [3] で3を含む
そして
[0-9] で0~9までの数値、つまりこれで30代になります

もちろん複数指定も可能です
grep ":[13][0-9]:" costomer.txt
とすれば、10代と30代がでてきます

2:井上直子:女:19:埼玉
4:千葉信夫:男:16:東京
102:加藤純子:女:35:千葉

あまり使い道はないように見えますが
テキストエディタで、メモしたときには検索するときに役立つと思います

例えば、お小遣いの記録とかには使えそうです

ちなみに、指定する時には名前付文字クラスで代用できます

主なものとして
[:alnum:]
すべてのアルファベット、10進数を示す
つまり
0-9A-Za-z を指定したのと同じ意味

[:alpha:]
すべてのアルファベット
つまり
A-Za-z と同じ

[:blank:]
空白文字
これは
スペースやタブなど

[:digit:]
10進数の文字
0-9 と同じ

[:lower:]
アルファベットの小文字
a-z と同じ

[:upper:]
アルファベットの大文字
A-Z と同じ

[:space:]
空白文字
こちらは、スペース、タブ、そして改行

[:xdigit:]
16進数につかう文字
0-9A-Fa-f と同じ

ちなみに、使うときには
[] で囲って
[[digit:]] というように使います

今回のように10~30代を調べるには
grep ":[13][[:digit:]]:" costomer.txt
とします

もちろん意味は変わらないので

2:井上直子:女:19:埼玉
4:千葉信夫:男:16:東京
102:加藤純子:女:35:千葉
と表示されます

テーマ : Linux
ジャンル : コンピュータ

正規表現で grep 検索を便利に その2

引き続き、正規表現をつかった grep の操作です

今回は、行頭をしめす ^

そして行末を示す $

これらを使った便利な検索を行っていこうと思います

まずは ^ からです

設定ファイルに追記し、記述があっているかわからない
もしくはエラーメッセージで何行目にエラー
となったときに、ファイルを開かずとも
該当するところを grep で表示できます

例えば
SetEnvIf Request_URI default.ida no_log
SetEnvIf Request_URI cmd.exe no_log
SetEnvIf Request_URI root.exe no_log
SetEnvIf Request_URI Admin.dll no_log
SetEnvIf Request_URI NULL.IDA no_log

を追記し、その確認をしたいのなら
行頭が SetEnv で始まっているので、今回の ^を使います

$ grep -n "^SetE" /etc/httpd/conf/httpd.conf
511:SetEnvIf Request_URI default.ida no_log
512:SetEnvIf Request_URI cmd.exe no_log
513:SetEnvIf Request_URI root.exe no_log
514:SetEnvIf Request_URI Admin.dll no_log
515:SetEnvIf Request_URI NULL.IDA no_log

これで行番号もでますので、ミスがあれば
sed コマンドで置き換えすれば修正できます


また、行末の単語で検索すれば、かなり便利に検索できます

例えば
Webサーバー構築(Apache)
にあるように、最後の文字が80ならば
$ grep -n "80$" /etc/httpd/conf/httpd.conf
133:#Listen 12.34.56.78:80
134:Listen 80
262:ServerName www.example.com:80
980:#NameVirtualHost *:80
というように、 vi でテキストを開いて / で単語をいれて検索するよりも
より効率的に調べることができます

テーマ : Linux
ジャンル : コンピュータ

正規表現で grep 検索を便利に

いろいろと検索するときに使える
grep コマンドですが、オプションや正規表現を使えば
さらに便利になります

とくに、設定スクリプトをつくりたいときに使っています

まずは、文字の検索です

grep "探したい文字" ファイル名
これで、ファイルのなかから任意の文字をさがせます

例えば
SELinuxの設定を無効にするため、
enforcing という場所がどこにあるかをみるには
grep "enforcing" /etc/sysconfig/selinux

で見れます
ただし、該当する行が全部でます

実行結果は
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
SELINUX=enforcing
となりました

"" で囲んであるのは、*などのメタキャラを含む場合に
シェルに展開されないようにするためです


続いて -c オプションをつけて、該当する行がいくつあるか数えます

今回は SELINUX とかかれている行の数を表示します
grep -c "SELINUX" /etc/sysconfig/selinux
4

これで該当するのは4行ということがわかりました


また、OR検索をするには
-e オプションをつけます
これはいくつか連続してできますが、絞り込みにはなりません

例えば
enforcing と SELINUX を含む行をだすには
grep -e "SELINUX" -e "enforcing" /etc/sysconfig/selinux
としますが
絞り込めていません
両方のうち、どちらかを含む行がでてきます

# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
SELINUX=enforcing
# SELINUXTYPE= can take one of these two values:
SELINUXTYPE=targeted

このため、絞り込みをするには、一度 grep で検索した結果を
パイプでさらに検索すれば絞り込み可能になります

grep "SELINUX" /etc/sysconfig/selinux | grep "enforcing"
これで
SELINUX=enforcing
となり、目的どおりの絞り込みができました

さらに -n オプションをつければ、行をしらべ
sed コマンドで簡単に書き換えできます

このときに注意するのは
最初のgrep コマンドで -n オプションをつけてから
絞りこみするということです

正解:$ grep -n "SELINUX" /etc/sysconfig/selinux | grep "enforcing"
7:SELINUX=enforcing

誤り:$ grep "SELINUX" /etc/sysconfig/selinux | grep -n "enforcing"
2:SELINUX=enforcing

このように、後にオプションをつけると行が変わってしまうのは
絞り込んだあとで行を数えているからです

このため。本来なら原文の7行めになるはずが
絞り込んだら2行めなので、2行めと表示
というようになってしまいます

sed などで一気に改造したいときには、調べるときに
こういった順番の誤差に気をつけましょう


テーマ : Linux
ジャンル : コンピュータ

最新記事
検索フォーム
GREEハコニワ攻略サイト
リンク
カテゴリ
月別アーカイブ
フリーエリア
最新記事
FXプライムレート
最新コメント
最新トラックバック