プロが教える店舗&オフィスのセキュリティ対策術

題名のとおり、expectを用いた正規表現のgrepをしたいのですが、
以下のように記述し、入力し、実行すると

expect -c "

spawn ssh ~~~
expect \"password:\"
send \"hogehoge\n\"
expect \">\"
send \"zgrep "探したいもの" /なんかのログ.log.gz | grep -v "[0-9]%"\n\"
expect \">\"
send \"exit\n\"
"

以下のようにエラーが出てしまいます。

invalid command name "1-9"
while executing
"1-9"
invoked from within

[0-9]この部分を\[0-9\]このようにエスケープしてみても同じエラーが出てしまい、実行できません。
どのようにすれば正規表現として認識してくれるのでしょうか。

以上よろしくお願いいたします。

A 回答 (2件)

> "探したいもの" → \\\"探したいもの\\\"


> 上記の部分に関しましては、
> 最初にzgrepの部分でエスケープしているためか、エスケープせずとも問題ないようです。


ちょっと思い違いをしているようですが

まず、この expect -c " の"以降を解釈するのは、これを実行するシェルです。
このままだと

> send \"zgrep "

の後の"が、-c "の"に対応するクオートです文字列です。
「探したいもの」はクオート無しです。
\でエスケープした"は、他の文字と同じになり、それ自体にクオートする機能はありません。
「"send \"zgrep "探したいもの" /なんかのログ.log.gz | grep -v "[0-9]%"\n\""」
は、例えば
「"send Qzgrep "探したいもの" /なんかのログ.log.gz | grep -v "[0-9]%"\nQ"」
と書いたのと、文法的な解釈は同じなのです。

> send \"zgrep "探したいもの" /なんかのログ.log.gz | grep -v "[0-9]%"\n\"
は、
クオートを展開した文字列「 ... send "zgrep 」
直に書かれた文字列「探したいもの」
クオートを展開した文字列「 /なんかのログ.log.gz | grep -v 」
直に書かれた文字列「[0-9]%」
クオートを展開した文字列「\n" ... send "exit\n"」
となります。

直に書かれた文字列では、
・空白があったら、単語の区切りとなって、別の引数になる
・特殊な文字はファイル名展開対象とかで使われてしまう
ということになります。

この例では「探したいもの」と空白無しですが、実際はここに空白が入ったりしてませんか?
そして、そこで-cの引数としては切れてしまったりしていませんか?

あと、 \nじゃなくて\\nだと思います。

expect -c を echo にして、表示されるのが、期待通りのexpectスクリプトになっているかも確認してみてください。


こういうのは、
・変数展開とか必要が無いところはシングルクオートを使う
・ヒアドキュメントを使う
・別のファイルにする
のが間違いが少ないです。
    • good
    • 1

ダブルクォーテーションを二重にエスケープしないといけないのでは?



"探したいもの" → \\\"探したいもの\\\"
"[0-9]%" → \\\"[0-9]%\\\"

この回答への補足

回答ありがとうございます。

"探したいもの" → \\\"探したいもの\\\"

上記の部分に関しましては、
最初にzgrepの部分でエスケープしているためか、エスケープせずとも問題ないようです。
また、[0-9]の部分に関しましては二重でエスケープしてみましたが、同じエラーとなってしまいました。

send \"zgrep "探したいもの" /なんかのログ.log.gz | grep -v "[0-9]%"\n\"

以上よろしくお願いいたします。

補足日時:2011/04/05 15:15
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!