正規表現で 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 の単語を含む行をだそうとしてもでませんでした
また、単語で調べるときには、日本語だとうまく動作しないようです

正規表現で 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個以上の任意の文字列にするなら
.*
ではなく
..*
としますのでご注意

正規表現で 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:千葉
と表示されます

正規表現で 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 でテキストを開いて / で単語をいれて検索するよりも
より効率的に調べることができます

正規表現で 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 などで一気に改造したいときには、調べるときに
こういった順番の誤差に気をつけましょう