여러 서버에서 문자열을 검색하여 파일에 넣습니다.

여러 서버에서 문자열을 검색하여 파일에 넣습니다.

안녕하세요 여러분, 저는 여러 서버(현재는 3개, 더 늘어날 수 있음)를 검색하려고 합니다.

내가 찾은 문자열에 대한 파일 및 서버의 출력입니다.

나는 이것을하고있다 :

for host in $(cat servers);
do
ssh -q -l user  $host "grep -oP '<url>.*:\K[^<]+' /opt/application/domain/config/jdbc/assetmanagement-xa-ds-jdbc.xml" >> test;
done;

문자열 목록(DB SID)이 포함된 파일 테스트를 받았습니다.

cat test
DB_SID1
DB_SID2
DB_SID3

내 서버 파일에 서버 IP 목록이 있습니다.

cat servers
192.168.2.1
192.168.2.2
192.168.2.3

테스트 파일에 두 개의 열 헤더와 서버 IP/이름 및 DB SID 이름을 갖고 싶습니다. (이렇게)

Server        DB_SID_Name
192.168.2.1   DB_SID1
192.168.2.2   DB_SID2
192.168.2.3   DB_SID3

인사

답변1

$ paste servers test
192.168.2.1     DB_SID1
192.168.2.2     DB_SID2
192.168.2.3     DB_SID3

paste유틸리티는 하나 이상의 파일에서 열을 생성합니다. 기본적으로 탭으로 구분되어 있지만 다음을 사용하여 구분 기호를 단일 문자로 변경할 수 있습니다 -d.

$ paste -d ':' servers test
192.168.2.1:DB_SID1
192.168.2.2:DB_SID2
192.168.2.3:DB_SID3

열 헤더를 추가하고 파일로 리디렉션합니다.

$ { printf '%s\t%s\n' 'Server' 'DB_SID_Name'; paste servers test; } >somefile
$ cat somefile
Server  DB_SID_Name
192.168.2.1     DB_SID1
192.168.2.2     DB_SID2
192.168.2.3     DB_SID3

귀하의 스크립트:

#!/bin/sh

{
    printf '%s\t%s\n' 'Server' 'DB_SID_Name'
    
    while IFS= read host; do
        ssh -n -q "user@$host" 'cat /opt/application/domain/config/jdbc/assetmanagement-xa-ds-jdbc.xml'
    done <servers |
    grep -oP '<url>.*:\K[^<]+' |
    paste servers -
} >somefile

이는 test파일을 생성하지 않지만 루프의 출력을 paste. 또한 전체 파일을 순환 목록 servers으로 확장하는 대신 한 줄씩 올바르게 읽습니다 .for

또한 원격 호스트에서 문제의 파일보다 cat더 복잡한 작업을 수행하려고 시도하지 않습니다. localhost로 이동 되고 grep한 번만 실행됩니다.

관련 정보