予想されるスクリプトでgrep -vを使用する方法

予想されるスクリプトでgrep -vを使用する方法

私は期待スクリプトで次のコマンドを実装しようとしましたが、最初にスクリプトに触れました。それ以外の場合は動作します。

$ grep -i cps config.cfg | grep -v "//cps" | grep -v "cps := 4.1" | \
    grep -v "cps := 2.2" | grep -v "cps := 5.1" | grep -v "cps := 7.4"| \
    awk '{ SUM += $3} END { print SUM}'

このコマンドは、特定の値(例:4.1、2.2、5.1、および7.4)を除いて、プロファイルの1秒あたりの合計cps呼び出しの数を要約します。

命令がかなり長いため、部分的に宣言しようとしましたが、スクリプトを実行すると構文エラーが発生します。

set cpscmd1 "grep -i cps traffic.cfg"
set cpscmd2 "| grep -v "//cps" | grep -v "cps := 4.1" | grep -v "cps := 2.2"
set cpscmd3 "| grep -v "cps := 5.1" | grep -v "cps := 7.4"| \
    awk '{ SUM += $3} END { print SUM}''"
...

exp_send "$cpscmd1 $cpscmd2 $cpscmd3 ";exp_send\r

これを正しく行う方法についていくつかのヒントを教えてください。

ベストアンサー1

発生した正確な構文エラーが何であるかを指定していませんが、主に引用符のエスケープに問題があるようです。たとえば、cpscmd2これらの二重引用符で開く引用符と閉じる引用符は何でなければならず、コマンド自体の一部と見なすべき引用符は何ですか?コマンドの一部として引用符を渡す方法は、次のようにエスケープすることです\

set cpscmd2 "| grep -v \"//cps\" | grep -v \"cps := 4.1\" | grep -v \"cps := 2.2\" "

(末尾に閉じる引用符はありません。)またはテキスト文字列を検索しているため、これらの文字列の周囲に単一引用符を使用して読みやすくすることができます。

set cpscmd2 "| grep -v '//cps' | grep -v 'cps := 4.1' | grep -v 'cps := 2.2' "

$また、ログアウトする必要がありますcpscmd3。最終試験\rも引用しなければなりません。

ただし、計算したくない値はSUMから具体的に省略して、awkコマンドが処理できるようにすることをお勧めします。結果は次のとおりです。

set cpscmd1 "grep -i 'cps' traffic.cfg | grep -v '//cps' "
set cpscmd2 "| awk '\$3 !~ /4.1|2.2|5.1|7.4/ { SUM += \$3} END { print SUM}' "
...

exp_send "$cpscmd1 $cpscmd2 \r"

おすすめ記事