쉘 스크립트는 생성된 파일을 awk할 수 없습니다.

쉘 스크립트는 생성된 파일을 awk할 수 없습니다.

몇 가지 간단한 통과/실패 테스트 스크립트를 만들려고 하는데 아래 설명된 대로 몇 가지 문제에 직면하고 있습니다. 내 의도는 문제가 감지되면 발생하는 다양한 검사를 수행하기 위해 파일을 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"                      }

관련 정보