몇 가지 간단한 통과/실패 테스트 스크립트를 만들려고 하는데 아래 설명된 대로 몇 가지 문제에 직면하고 있습니다. 내 의도는 문제가 감지되면 발생하는 다양한 검사를 수행하기 위해 파일을 results.txt
구문 분석하는 동안 명령(예: ping)의 전체 결과를 파일에 저장하는 것 입니다.results.txt
#!/bin/bash
ping -c 20 google.com > results.txt
packetloss = `awk '/packet loss/{x=$6} END{print x}' results.txt`
echo "$packetloss" >> debug.txt
# if packetloss > 0, add to an error.txt to fail
# if avg ping time > 5ms, add to an error.txt to fail
packetloss 변수를 가져오지 못함awk
파일의 정보 results.txt
(보기 위해 디버그 파일로 전송됨) 쉘 스크립트에 이 문제와 관련 해결 방법을 방지할 수 있는 것이 있는지 궁금합니다.
수동으로 실행하면 예상되는 "0%"가 awk
반환됩니다 .results.txt
답변1
주위에 공백이 허용되지 않습니다 =
!
그래서:
#!/bin/bash
ping -c 20 google.com > results.txt
packetloss=$(awk '/packet loss/{print $6}' results.txt)
echo "$packetloss" >> debug.txt
또는 더 짧게:
ping -c 20 google.com |
awk '/packet loss/{sub(/%/, "");print $6 >> "debug.txt"}'
노트:
x
변수에 값을 할당 할 필요가 없으며$6
직접 인쇄할 수 있습니다.- AWK 자체는 출력으로 새 파일을 생성할 수 있습니다.
- 백틱
`
다음과 같은 이전 스타일의 명령 대체에 사용됩니다.
foo=`명령어`
foo=$(command)
대신 이 구문을 사용하는 것이 좋습니다. 내부 백슬래시 처리는 $()
놀라운 일이 아니며 $()
중첩하기가 더 쉽습니다.
확인하다http://mywiki.wooledge.org/BashFAQ/082
사용할 추가 솔루션진주:
ping -c 20 google.com |
perl -lne '/(\d+)%\s+packet\s+loss/ and print $1' >> debug.txt
답변2
#!/usr/bin/perl
my $host=shift or die("Usage $0 host\n");
open(PING , "-|", "ping -c 20 $host") or die;
open(DEBUG, ">>", "debug.txt" ) or die;
while(<PING>){
if(m!(\d+)% packet loss! ){ $Lost=$1 }
if(m!rtt.*= (.+?)/(.+?)/(.+)!){ $Avg=$2 }
}
if ( $Lost > 0 ) { print DEBUG "not ok: lost pcks ($Lost%)\n" }
elsif( $Avg > 5 ) { print DEBUG "not ok: too slow ($Avg)\n" }
else { print DEBUG "ok: ping\n" }