예상 스크립트에서 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)을 제외하고 프로필의 초당 총 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"

관련 정보