awk 명령에서 값을 읽는 방법은 무엇입니까?

awk 명령에서 값을 읽는 방법은 무엇입니까?

결과 파일이 있고 "rx 셀" 값을 읽어야 합니다. 보고서 파일은 다음과 같습니다. test.log 파일의 내용은 다음과 같습니다.

    co_result=test.log  

    ZyXEL IES-1000> statistics port 12 0 33
    [adsl channel 12-0/33]
    tx packets: 56
    rx packets: 60
    tx rate   : 0
    rx rate   : 0
    tx cells  : 468
    rx cells  : 1707
    errors    : 0
    ZyXEL IES-1000>

rx 셀 값을 읽으려면 다음 명령을 사용합니다.

    cells=$(grep -e 'cells' $co_result | cut -d: -f2 | awk '{print $1}'| awk 'NR%2{printf $0"";next;}1')
    echo "Var_value: $cells"

하지만 파일에서 위의 2개 명령을 실행하려고 하면 문제가 발생합니다. echo의 처음 몇 문자가 표시되지 않는 다음 출력을 얻습니다.

       1707value: 530  

$cells 변수에는 1707만 있을 것으로 예상했지만 오류가 인쇄되었습니다. 문제를 이해하지 못합니다. 문제를 해결하는 데 도움을 주실 수 있나요?

답변1

명령 대체가 불필요하게 복잡합니다.

대신에:

cells=$( awk '/rx cells/ { print $NF }' <"$co_result" )
printf 'Var_value: %s\n' "$cells"

$NF줄에 문자열이 포함된 경우 인쇄될 줄의 마지막 공백으로 구분된 필드입니다 rx cells.

또한 입력 파일이 DOS 텍스트 파일이 아닌 Unix 텍스트 파일인지 확인하십시오. 이 파일을 실행하여 dos2unixUnix 텍스트 파일로 변환하세요.


명령을 확인하십시오.

grep -e 'cells' $co_result | cut -d: -f2 | awk '{print $1}'| awk 'NR%2{printf $0"";next;}1'

첫째: 공백, 탭, 개행 문자 또는 기타 특수 문자(따옴표로 묶이지 않았기 때문에)가 포함되어 있으면 grep -e 'cells' $co_result실패합니다 .$co_result

명령 출력

tx cells  : 468
rx cells  : 1707

그 다음에: cut -d: -f2. 이 출력

 468
 1707

그 다음에: awk '{print $1}'. 출력은 위와 동일하지만 초기 공백이 제거되었습니다.

그 다음에: awk 'NR%2{printf $0"";next;}1'. 이는 혼란스러운 접근 방식 paste -d' ' - -과 결과 입니다.

468 1707

후자는 echo출력됩니다

Var_value: 468 1707

이 정보를 얻지 못하는 이유는 입력 파일이 DOS 텍스트 파일이고 각 줄 끝에 캐리지 리턴이 포함되어 있기 때문입니다. 따라서 커서는 인쇄 후 줄의 시작 부분으로 다시 이동합니다 468.

dos2unix입력 파일에 사용하세요.

당신이 어디서 왔는지 530모르겠습니다.

답변2

다음을 간단히 사용할 수 있습니다 grep.

 cells=$(grep -F "rx cells" "$co_result" | grep -oE "[0-9]+")

그러면 다음을 통해 숫자가 변수로 추출됩니다.

grep -F "rx cells" $co_result: 다음을 포함하는 행을 추출합니다 rx cells : 1707
grep -oE "[0-9]+". 숫자만 일치하는 정규 표현식에 대한 일치만 출력: 1707

다음과 같이 좀 더 정교한 sed그룹 대체를 사용하여 값을 추출할 수도 있습니다.

cells=$(sed  -r -n 's/rx cells.*\W([0-9]+)/\1/p' "$co_result")
  • -r: 확장 정규식 활성화
  • -n: 특정 줄만 인쇄
  • 's///p': s는 대체를 의미하고, p는 패턴과 일치하는 행을 명시적으로 인쇄합니다.
  • rx cells.*\W([0-9]+)match는 rx cells .*\W단어가 아닌 문자까지 모든 문자와 일치하며 ([0-9]+) 그룹에서 하나 이상의 숫자를 캡처합니다.
  • \1출력을 n개의 캡처된 숫자를 포함하는 첫 번째 그룹으로 바꿉니다.

관련 정보