今回は、複数の正規表現を組み合わせてみました
1:山田太郎:男:43:東京
2:井上直子:女:19:埼玉
3:山本真一:男:43:福岡
4:千葉信夫:男:16:東京
5:秋山敬一郎:男:44:秋田
100:藤本信:男:40:東京
101:藤本信:男:40:東京
102:加藤純子:女:35:千葉
103:福岡勲:男:41:香川
104:桂井昭宏:男:53:福岡
という内容の costomer.txt というファイルを使い
最初の会員番号を示すフィールドから
指定した会員番号のところを表示するようにします
egrep “^(1|5|103):” costomer.txt
とします
結果は
1:山田太郎:男:43:東京
5:秋山敬一郎:男:44:秋田
103:福岡勲:男:41:香川
となります
“^(1|5|103):”
というように、^ の後を囲うことで、行頭の数字になるように
設定しています
もし、”^1|5|103 とすると
最初は目論見どおりですが
後の5 103 は行頭の指定が反映されません
このため、任意のところにしたいときには()での指定が
必要になります
また、egrep のオプションで -o をつけると
マッチする部分のみ表示することも可能です
egrep -o “^(1|5|103):” costomer.txt
とすると
1:
5:
103:
となります
これは、スクリプトなどで修正したときに確認するのに使えそうです
また、このマッチする部分というところを利用して
範囲指定もできます
egrep -o “[0-9].*[0-9]” costomer.txt
とすれば、数字に囲まれている間だけを表示できます
1:山田太郎:男:43
2:井上直子:女:19
3:山本真一:男:43
4:千葉信夫:男:16
5:秋山敬一郎:男:44
100:藤本信:男:40
101:藤本信:男:40
102:加藤純子:女:35
103:福岡勲:男:41
104:桂井昭宏:男:53
応用すれば、単語で範囲指定とかもできそうです
拡張正規表現と egrep その2
引き続き、拡張正規表現 egrep についてです
今回は、会員番号で検索するというのをやってみます
使用するファイルは
costomer.txt
です
内容は
1:山田太郎:男:43:東京
2:井上直子:女:19:埼玉
3:山本真一:男:43:福岡
4:千葉信夫:男:16:東京
5:秋山敬一郎:男:44:秋田
101:藤本信:男:40:東京
102:加藤純子:女:35:千葉
103:福岡勲:男:41:香川
104:桂井昭宏:男:53:福岡
となっています
それでは、会員番号3桁のところだけを調べます
egrep “^[0-9]{3}:” costomer.txt
これで
101:藤本信:男:40:東京
102:加藤純子:女:35:千葉
103:福岡勲:男:41:香川
104:桂井昭宏:男:53:福岡
となります
まず、最初の^で行頭を意味し
次の [0-9] で 0~9まで
そして {3} で3回繰り返す
つまり、100~999までになります
また、ゾロ目の数値だけを取り出すこともできます
今回は
年齢のフィールドを対象にして年齢がゾロ目の人を表示します
ゾロ目を表示するには、
文字列を()で囲ってグループ化し
さらに
\1 を使って後方参照します
後方参照は \1 を使ってのグループ呼び出しです
egrep “:([0-9])\1” costomer.txt
を実行すると
5:秋山敬一郎:男:44:秋田
となります
この
([0-9])\1
の部分がゾロ目を意味しています
拡張正規表現と egrep
拡張正規表現は、標準の正規表現にメタキャラを追加し
より柔軟なパターンを追加したものです
以下は、egrep だけで使える正規表現の一例です
?
直前の正規表現の0回もしくは1回の繰り返し
+
直前の正規表現の化言い条の繰り返し
{n}
直前の正規表現のn回の繰り返し
{n,}
直前の正規表現のn回以上の繰り返し
{n,m}
直前の正規表現のn回~m回の繰り返し
正規表現1|正規表現2
いずれかのパターンにマッチ
(正規表現)
正規表現のグループ化
\n
グループ化された n番めの正規表現に
マッチした文字列を呼び出す
というようになります
日経 Linux 2011-03
に例題が載っていますので、明日以降
また例題をみながらやっていきます
正規表現で grep 検索を便利に その5
引き続き、正規表現です
正規表現にはメタキャラがあります
主なものとして
^
行の始まり
$
行末
.
任意の1文字
*
直前の正規表現
もしくは
0回以上の繰り返し
[文字列]
いずれかの文字
例:[abc]
ならa か b か c になる
[^文字列]
この文字列以外の文字
例:[^abc]
ならabc を含まない行をしめす
\b
単語の区切り
\<
単語のはじまり
\>
単語の終わり
\w
すべての英数字
[[:alnum:]]
と同じ意味になる
\W
すべての英数字以外
[^[:alnum:]]
と同じ意味
というようになります
一番使えそうなのが、みたところ単語なのですが
この単語とは
スペースや Tab , ; などで区切られた文字列なので
なれないと使い勝手はよくありません
試しに、FTPサーバー構築のために、ファイルを grep で調べてみたのですが
grep “\
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 などで一気に改造したいときには、調べるときに
こういった順番の誤差に気をつけましょう
月曜日はIMMのポジション量発表
IMMのポジション量によれば、一番ロングが積もっているのがポンド
ちなみに円はショートになりつつあるため、円買いの可能性あり
ポンドに関しては、史上最大までもう少しだけど、ドル円がはっきりしないと危険
あとはスイスだけど、これは中東不安からきてるとのこと
よくある有事のスイスフラン買い
金融危機、かつてのリーマンショックのときに、対スイスフランはすごい上昇
カナダは原油高が要因でロング拡大
こちらも中東不安により原油高になり、結果カナダロング拡大につながるようです
ただし、先行きは微妙
NZドルは、金利が人気だけど、金利の先行きが微妙
むしろ、食料輸出国の強みと、最近の食料価格高騰による景気拡大が理由でロング拡大
豪ドルが一番わかりにくく
銀行格下げや、洪水被害、があるけど金利差が人気、そして資源価格高騰が理由でロング拡大らしい
ただ、欧米の金利があがると、金利差はなくなり、レバトリになるリスクもあるかもしれません
毎週 月曜日にはIMMのポジション量発表になりますので
ある程度の参考にはなります
史上最大のロングや、ショートとでてきたら、要注意です
ちなみに、IMMのポジション量は対ドルになりますので
クロス円と間違えないようにしましょう
シェルスクリプトで chown
シェルスクリプトで
chown コマンドを使うようにしてみました
test.txt というファイルをつくり、中身を適当に用意します
vi test.txt
で作成し
aaaaa
bbbbb
という内容にします
今回は、所有権の変更なので、中身は適当です
通常、chown ユーザ名 ファイル名
となりますが
今回は
vi chowntest.sh
でスクリプトを作成してみました
#!/bin/bash
echo “変更するユーザ名を入力”
read name
chown $name. test.txt
という内容です
これを
sh chowntest.sh
とすれば
所有権が入力したユーザ名に変わります
ただし、存在しないユーザを入力するとエラーになります
このスクリプトを使えば、
よくある
chmod ユーザ名. /var/www/html/
のときに簡単に設定できそうです
(通常は root 権限なので、変更は必須ですから)
構文の中にある read は
キーボードからの入力をするために使っています
シェルスクリプト :: read コマンド
そして
【 文字列の入力 】
を参考にしてみました