1

「.exp」スクリプトを使用して、ホストの合計メモリを取得したいと考えています。

ホストの内部に入ったら、次の行を実行します。

"send "top -n 1 | grep Mem: | awk '{ print $(NF-7) }' | cut -d 'k' -f1\r""

スクリプトの実行中に、次のエラーが返されます。

 can't read "(NF-7)": no such variable

しかし、ホスト内で手動で取得し、同じ行を実行すると(「送信」部分なしで)、予想される数が返されます...

私が間違っていることは何ですか?何か案が?同じことを行う他の方法の提案はありますか?

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

アントニオ

4

2 に答える 2

3

の出力は、topこの方法で解析されることを意図したものではありません。他のより簡単な(より良い!)方法でメモリの量を取得できます。

sed -n -e '/^MemTotal/s/^[^0-9]*//p' /proc/meminfo

または、の出力を解析できますfree。これは、便利なサイズで表示する方法も知っています。

# total memory in megabytes
free -m | sed  -n -e '/^Mem:/s/^[^0-9]*\([0-9]*\) .*/\1/p'

編集:あなたは常に「誰が何を拡張するのか」と自問する必要があります。

これらのコマンドをexpectで送信するには、

send "sed -n -e '/^MemTotal/s/^\[^0-9\]*//p' /proc/meminfo\n"

# also removes kb suffix
send "sed -n -e '/^MemTotal/{s/^\[^0-9\]*//;s/ .*//p}' /proc/meminfo\n"

# displays in megabytes
send "free -m | sed -n -e '/^Mem:/{s/^\[^0-9\]*//;s/ .*//p}'\n"

expectこれは、他の方法で処理され、意図されたものから逃れsedます。

そして、これがあなたのオリジナルの(適切にエスケープされた)バージョンです。

send "top -n 1 | grep Mem: | awk '{ print \$(NF-7) }' | cut -d 'k' -f1\n"
于 2012-04-23T09:13:12.797 に答える
2

Expect は Tcl 拡張です。Tcl は$variables二重引用符で囲まれた文字列に置き換えられます (チュートリアルの章を参照)

中かっこを使用してリテラル文字列を送信します。

send {top -n 1 | grep Mem: | awk '{ print $(NF-7) }' | cut -d 'k' -f1}
send "\r"
于 2012-04-23T13:31:33.070 に答える