awk 출력에서 ​​캐리지 리턴 억제/제거

awk 출력에서 ​​캐리지 리턴 억제/제거

서버 목록에서 가동 시간/로드 평균을 반환하고 awk를 사용하여 출력 형식을 지정하는 간단한 명령이 있습니다.

for i in $(cat servers); do ssh $i -qt "uptime" | awk -F\, -v host=\"$i\" '{ print host, $4, $5, $6 }'; done

이것은 꽤 잘 작동합니다.

"server1"   load average: 0.22  0.37  1.99
"server2"   load average: 0.22  0.37  1.99
"server3"   load average: 5.96  4.39  5.66

불행하게도 마지막 필드에는 캐리지 리턴이 포함되어야 합니다. 즉, 명령 끝 외에는 어디에도 나타날 수 없습니다. 예를 들어:

for i in $(cat servers); do ssh $i -qt "uptime" | awk -F\, -v host=\"$i\" '{ print host, $6, $5, $4 }'; done

산출:

0.64   load average: 0.17"  1.74
0.64   load average: 0.17"  1.74
0.78   load average: 0.15"  3.24

a) 입력 끝 또는 b) $6 필드 끝에서 캐리지 리턴을 어떻게 제거합니까?

답변1

처음부터 캐리지 리턴이 생성되지 않도록 하려면 이 -t옵션을 제거해야 합니다 .ssh

-t옵션은 ssh에 의사 터미널을 할당하도록 지시합니다.외딴해당 터미널에 플래그가 설정된 경우 (기본값) 각 LF( )는 onlcr출력 시 \nCR/LF( )로 변환됩니다 . 전체 화면 및/또는 대화형 프로그램(예: 또는 )을 실행하지 않는 한 \r\n이 옵션은 필요하지 않습니다.-tviscreen

그러나 실제로 CR/LF 로 끝나는 줄을 처리해야 하는 경우 awk다중 문자/정규식 레코드 구분 기호(예: gawk 또는 mawk)를 지원하는 awk 구현에서 레코드 구분 기호를 CR/LF로 설정할 수 있습니다. 예:

awk ... 'BEGIN{RS="\r\n"}{...}'

또한 필드에서 길 잃은 CR을 제거하려는 경우 다음 을 awk사용할 수 있습니다. sub또는 다음 을 사용할 수 gsub있습니다(어디서나 작동함).

gsub("\r","",$6)

답변2

\rsed를 사용하여 후행을 제거할 수 있습니다.

ssh $i -qt "uptime" | sed 's/\r$//' | awk ...
# ....................^^^^^^^^^^^^^

또한 모범 사례를 위해파일에서 줄을 읽지 마세요for

답변3

"sed"를 사용하라는 답변을 보았습니다.
대안으로 "tr"을 사용하라고 제안했습니다.

$ awk '{print $1}' < /proc/loadavg  | tr '\n' ' '

또는

$ awk '{print $1}' < /proc/loadavg  | tr -d '\n'

관련 정보