서버 명령 출력을 다음 줄로 분할

서버 명령 출력을 다음 줄로 분할

"pssh"를 사용하여 1000개 이상의 서버에서 명령을 실행하는 bash 스크립트를 준비 중입니다(/tmp/hosts에 저장됨).

pssh -h /tmp/hosts -i "uname;date"

[1] 13:10:56 [FAILURE] SERVER1 Exited with error code 255
Stderr: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@       WARNING: POSSIBLE DNS SPOOFING DETECTED!          @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
The ECDSA host key for SERVER1 has changed,
and the key for the corresponding IP address 10.238.36.42
has a different value. This could either mean that.............
......................
[2] 13:10:56 [SUCCESS] SERVER2
Linux
Fri Jan 25 12:10:56 UTC 2019
[3] 13:10:56 [SUCCESS] SERVER3
Linux
Fri Jan 25 13:10:56 CET 2019
[4] 13:10:56 [SUCCESS] SERVER4
Linux
Fri Jan 25 12:10:56 UTC 2019
[5] 13:10:56 [SUCCESS] SERVER5
Linux
Fri Jan 25 12:10:56 UTC 2019
[6] 13:10:56 [SUCCESS] SERVER6
Linux
Fri Jan 25 12:10:56 UTC 2019

아래와 같은 출력이 예상됩니다. 경고가 있으면 경고를 억제합니다.

[FAILURE], SERVER1, Exited with error code 255
[SUCCESS], SERVER2,Linux,Fri Jan 25 12:10:56 UTC 2019
[SUCCESS], SERVER3,Linux,Fri Jan 25 12:10:56 UTC 2019
[SUCCESS], SERVER4,Linux,Fri Jan 25 12:10:56 UTC 2019
[SUCCESS], SERVER5,Linux,Fri Jan 25 12:10:56 UTC 2019
[SUCCESS], SERVER6,Linux,Fri Jan 25 12:10:56 UTC 2019
[FAILURE], HOST1, Exited with error code 255
[FAILURE], HOST2, Exited with error code 255

답변1

@Imorg 덕분에 다음을 사용할 수 있습니다.

pssh -h /tmp/hosts -i "uname;date"  | grep -o \[[A-Z][A-Z][A-Z]*\].* | sed -Ee 's/(^\[FAILURE\]) (SERVER[0-9]*) (.*)/\1, \2, \3/g' -Ee 's/(^\[SUCCESS\]) (.*)/\1, \2,'"$(uname)"','"$(date)"'/g'

따라서 grep -o \[[A-Z][A-Z][A-Z]*\].*출력은 다음과 같습니다.

[FAILURE] SERVER1 Exited with error code 255
[SUCCESS] SERVER2
[SUCCESS] SERVER3
[SUCCESS] SERVER4
[SUCCESS] SERVER5
[SUCCESS] SERVER6

그리고 FAILURE`와 SERVER 및 EXITED 사이에 있습니다 sed -Ee 's/(^\[FAILURE\]) (SERVER[0-9]*) (.*)/\1, \2, \3/g'.between strings containing

처음 두 단어 사이에 sed -Ee 's/(^\[SUCCESS\]) (.*)/\1, \2,'"$(uname)"','"$(date)"'/g'추가하고 추가합니다 .,,output of uname command, output of date command

따라서 최종 출력은 다음과 같습니다.

[FAILURE], SERVER1, Exited with error code 255
[SUCCESS], SERVER2,Linux,Fri Jan 25 19:27:30 UTC 2019
[SUCCESS], SERVER3,Linux,Fri Jan 25 19:27:30 UTC 2019
[SUCCESS], SERVER4,Linux,Fri Jan 25 19:27:30 UTC 2019
[SUCCESS], SERVER5,Linux,Fri Jan 25 19:27:30 UTC 2019
[SUCCESS], SERVER6,Linux,Fri Jan 25 19:27:30 UTC 2019

답변2

질문하신 내용이 100% 확실하지는 않지만 다음 내용이 도움이 될 것 같습니다.

# What you get
$ uname; date
Linux
Fri 25 Jan 13:09:13 GMT 2019

# What you want
$ echo "$(uname), $(date)"
Linux, Fri 25 Jan 13:09:42 GMT 2019

따라서 귀하의 명령은 다음과 같습니다

pssh -h /tmp/hosts -i 'echo "$(uname), $(date)"'

(작은 따옴표 사용에 유의하세요. 로컬 셸이 프로세스 하위 셸을 확장하지 않도록 하는 것이 중요합니다.)

이것이 하는 일은 서브쉘로 실행되고 uname결과 dateecho명령에 변수로 반환하는 것입니다. 상술 한 바와 같이:

echo "$(uname), $(date)"
# expands as
echo Linux, Fri 25 Jan 13:10:57 GMT 2019

그런데 저는 pssh에 익숙하지 않습니다. 사용자가 /etc/group원격 서버 파일(또는 공유 인증 서버)에 정의한 $SHELL이 무엇이든 실행된다고 가정합니다 . 그렇지 않으면 위의 트릭이 작동하지 않을 수 있습니다. 하지만 서버 팜을 관리하려면 다른 시스템을 살펴보는 것이 좋습니다. 예를 들어, SSH를 사용하는 경향이 있다면 Ansible이 적합할 수 있습니다.


편집: 좋습니다. 이제 몇 가지 추가 요구 사항을 이해했습니다.

실패한 첫 번째 줄만 원하는 경우 이를 제거할 수 있습니다.

pssh -h /tmp/hosts -i 'echo "$(uname), $(date)"' | grep -Eo '\[(SUCCESS|FAILURE)\].*$'

( -E확장된 정규식 지원을 위해 전체 줄이 아닌 일치하는 패턴만 반환 할 수 (SUCCESS|FAILURE)있습니다 .-o

정말로 쉼표가 필요한 경우에는 다음 위치에 추가할 수도 있습니다 sed.

pssh -h /tmp/hosts -i 'echo "$(uname), $(date)"' | egrep -o '\[(SUCCESS|FAILURE)\].*$' | sed -r 's:(\[(SUCCESS|FAILURE)\]):\1,:'

:(위의 예에서 이 문자를 사용한 sed이유는 이 문자가 더 읽기 쉽고 무엇을 하는지 볼 수 있기 때문입니다. 하지만 /원하는 경우 더 일반적인 문자로 바꿀 수 있습니다.)

그것이 하는 일은 ( 역참조를 통해) 문자열 과 쉼표를 찾 [SUCCESS]거나 반환하는 것입니다.[FAILURE]\1

예:

$ echo -e "sdfsdfsdf[FAILURE] $(uname), $(date)\nsdfsdf\nasdfsdf" | grep -Eo '\[(SUCCESS|FAILURE)\].*$' | sed -r 's:(\[(SUCCESS|FAILURE)\]):\1,:'
[FAILURE], Linux, Fri 25 Jan 16:15:03 GMT 2019

어떤 이유로 then 이외의 것을 반환할 수 있다면 [SUCCESS]코드 [FAILURE]는 (아이러니하게도) 더욱 단축될 수 있습니다 [A-Z]+.

pssh -h /tmp/hosts -i 'echo "$(uname), $(date)"' | egrep -o '\[[A-Z]+\].*$' | sed -r 's:(\[[A-Z]+\]):\1,:'

(SUCCESS|FAILURE)[A-Z]+하지만 일부 거짓 긍정이 반환될 경우를 대비해 지금은 이 버전을 사용하는 것이 좋습니다 .

관련 정보