![예상 스크립트에서 grep -v를 사용하는 방법](https://linux55.com/image/58544/%EC%98%88%EC%83%81%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C%20grep%20-v%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
나는 기대 스크립트에서 다음 명령을 구현하려고 시도하면서 스크립트를 처음 접했습니다. 그렇지 않으면 작동합니다.
$ 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"