如何在expect脚本中使用grep -v

如何在expect脚本中使用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}'

该命令汇总了配置文件中每秒的 cps 调用总数,不包含某些值(例如 4.1、2.2、5.1 和 7.4)。

由于命令很长,我正在考虑分部分声明该命令,但在执行脚本时出现语法错误:

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\" "

(您还缺少末尾的右引号。)或者,由于您正在 grep 文本字符串,因此可以对这些字符串使用单引号,使其更具可读性:

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

您还需要退出$登录cpscmd3。你的期末考试\r也应该被引用。

但我建议让 awk 命令处理您不想计算的值,方法是从 SUM 中专门忽略它们。这最终将是:

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"

相关内容