tail 및 bash : 동일한 것으로 예상되는 경우 다른 출력

내 로그를 정렬하려고하는데 한 자리 날짜가 잘못 잘리는 것을 발견했습니다. 0을 추가하거나 여분의 공백을 제거하십시오.
그 전에 편집하려는 올바른 줄을 얻는 방법을 알고 싶었습니다.

마지막 3 줄 :

$tail -3 testlog Wed Feb 7 23:30:59 2018 daemon.info hostapd: wlan0: STA de:ad:be:ef:c0:fe WPA: group key handshake completed (RSN) Wed Feb 7 23:40:59 2018 daemon.info hostapd: wlan0: STA de:ad:be:ef:c0:fe WPA: group key handshake completed (RSN) Wed Feb 7 23:50:59 2018 daemon.info hostapd: wlan0: STA de:ad:be:ef:c0:fe WPA: group key handshake completed (RSN) 

이제 스크립트로 작업하면서 동일한 결과를 기대하면서 다음과 같이 썼습니다.

$ while read line; do if [ $(echo $line|cut -c7) == "b" ]; then echo $line; fi; done < testlog | tail -3 Wed Feb 7 23:30:59 2018 daemon.info hostapd: wlan0: STA de:ad:be:ef:c0:fe WPA: group key handshake completed (RSN) Wed Feb 7 23:40:59 2018 daemon.info hostapd: wlan0: STA de:ad:be:ef:c0:fe WPA: group key handshake completed (RSN) Wed Feb 7 23:50:59 2018 daemon.info hostapd: wlan0: STA de:ad:be:ef:c0:fe WPA: group key handshake completed (RSN) 

하지만 이것으로 7 앞의 여분의 공간이 제거됩니다. 이런 일이 발생할 것으로 예상하지 못했습니다. “대본으로 자르지 않습니까?

미리 감사합니다!

p>

댓글

답변

다른 두 배 (또는 그 이상) 공백에 대해서도 동일하게 표시됩니다. 따옴표가없는 변수 확장 뒤에는 단어 분할 이 따르기 때문에 단어가 공백 (IFS)으로 분할되면 그 사이에 하나의 공백이있는 재 조립됩니다.

한 가지 해결 방법은 다음과 같습니다. :

쉘은 매개 변수 확장, 명령 대체 및 산술 확장의 결과를 스캔합니다. 단어 분할의 경우 큰 따옴표 안에 표시됩니다.

구체적인 예는 다음을 참조하세요.

$ line="Wed Feb 7 23:30:59" $ echo $line Wed Feb 7 23:30:59 

대 :

$ line="Wed Feb 7 23:30:59" $ echo "$line" Wed Feb 7 23:30:59 

읽을만한 가치가 있습니다. 쉘 스크립트가 공백이나 기타 특수 문자로 인해 질식하는 이유는 무엇입니까?

댓글

  • 예 : var='1 1' (공백이 많으면 마크 업에서 사라짐 여기) 뒤에 echo $varecho "$var"가 표시됩니다.
  • 실제로 훌륭한 점입니다. '는 공백을 잃는 ' 인용되지 않은 에코입니다.
  • 매우 명확합니다! 감사합니다 @JeffSchaller 및 kusalananda

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다