즉, 단일 행 출력 문자열을 여러 행으로 분할하고 각 원본 문자열에 호스트 이름을 태그 지정하고 싶습니다.
호스트 이름 프로세스 이름 CPUCore
출력=$(ssh -q -o "StrictHostKeyChecking yes" $ssh_host 'ps -eo comm,lastcpu | grep rrcp')
아래와 같이 출력을 반환하여 루프를 삽입하려면 어떻게 해야 합니까?
rrcpd 17 rrcpd 0
다음과 같이 다시 작성되었습니다.
Hostname1 rrcpd 17
Hostname1 rrcpd 0
노트
숫자는 0-32일 수 있습니다.
호스트 이름은 변수 문자열 $myhost입니다.
텍스트가 변경됩니다. 이는 엄밀히 말하면 rrcpd가 아니라는 의미입니다.
rrcpd 17 rrcpd 0
치즈3 케이크 8
고양이 9 개 3
각 호스트에서 실행할 명령
출력=$(ssh -q -o "StrictHostKeyChecking yes" $ssh_host 'ps -eo comm,lastcpu | grep rrcp')
grep을 제거하면 3~5개의 프로세스를 거쳐 출력이 다시 나올 수 있기 때문에 각 출력을 분할하고 원본 파일에 호스트 이름을 추가하여 각 출력에 레이블을 지정할 수 있도록 하고 싶습니다. 각 호스트에서 어떤 프로세스가 실행되고 있는지 확인하고 있습니다.
rrcpd 0 rrcp_mon.sh 24
RRCPD 0
RRCPD 0
rrcpd 0 rrcpd 1
rrcpd 0 rrcpd 0 rrcp_mon 24 rrcp_mon 24
RRCPD 0
RRCPD 0
rrcpd 17 rrcpd 0
ard 9 ssh 32 httpd 21 bax 22
아래 제공된 내용을 수정하여 작동하게 만들었습니다.
#!/bin/bash
for remote in $(cat ssh_hosts2.txt)
do
ssh -q -o StrictHostKeyChecking=yes "$remote" ps -eo comm,lastcpu |
sed "s/^/$remote /"
done
답변1
이것을 시도하십시오,
주어진 샘플 출력을 /tmp/test.txt 파일에 저장했습니다.
xargs -n 2 | sed 's/^/Hostname1 /'
-n
라인당 최대 매개변수를 나타냅니다.
예를 들어;
cat /tmp/test.txt | xargs -n 2 | sed 's/^/Hostname1 /g'
Hostname1 rrcpd 17
Hostname1 rrcpd 0
Hostname1 Cheese 3
Hostname1 cakes 8
Hostname1 Cats 9
Hostname1 dogs 3
답변2
표시된 데이터 유형(명령 출력에서 한 줄에 2개 이상의 필드)을 볼 수 있는 유일한 이유는 ssh
+ 호출의 출력을 변수로 수집한 다음 이를 올바르게 참조하지 않고 출력하는 경우입니다. 다행히도 변수의 데이터를 전혀 수집할 필요가 없습니다.ssh
ps
output=$(ssh ...)
echo $output
echo "$output"
while read remote; do
ssh -n -q -o StrictHostKeyChecking=yes "$remote" ps -eo comm,lastcpu |
awk -v host="$remote" '/rrcp/ { print host, $1, $2 }'
done <hosts.txt
여기서는 명령에서 직접 읽고 원래 awk
코드에서 ssh
수행된 작업 도 수행합니다. 두 개의 필드가 포함된 행을 가져오고 각 필드 쌍 앞에 grep
지정된 호스트 이름(에서 읽음 )을 붙인다고 가정합니다.hosts.txt
또는,
while read remote; do
ssh -n -q -o StrictHostKeyChecking=yes "$remote" ps -eo comm,lastcpu |
sed "s/^/$remote /"
done <hosts.txt
여기서는 텍스트 파일에서 읽은 호스트 이름을 각 줄의 앞에 붙이기만 하면 됩니다.