
서버 목록에서 가동 시간/로드 평균을 반환하고 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
출력 시 \n
CR/LF( )로 변환됩니다 . 전체 화면 및/또는 대화형 프로그램(예: 또는 )을 실행하지 않는 한 \r\n
이 옵션은 필요하지 않습니다.-t
vi
screen
그러나 실제로 CR/LF 로 끝나는 줄을 처리해야 하는 경우 awk
다중 문자/정규식 레코드 구분 기호(예: gawk 또는 mawk)를 지원하는 awk 구현에서 레코드 구분 기호를 CR/LF로 설정할 수 있습니다. 예:
awk ... 'BEGIN{RS="\r\n"}{...}'
또한 필드에서 길 잃은 CR을 제거하려는 경우 다음 을 awk
사용할 수 있습니다. sub
또는 다음 을 사용할 수 gsub
있습니다(어디서나 작동함).
gsub("\r","",$6)
답변2
\r
sed를 사용하여 후행을 제거할 수 있습니다.
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'