결과 파일이 있고 "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 텍스트 파일인지 확인하십시오. 이 파일을 실행하여 dos2unix
Unix 텍스트 파일로 변환하세요.
명령을 확인하십시오.
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개의 캡처된 숫자를 포함하는 첫 번째 그룹으로 바꿉니다.