複数のサーバーで文字列を検索してファイルに入れます。

複数のサーバーで文字列を検索してファイルに入れます。

こんにちは、私は複数のサーバー(現在は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

テストファイルに2つの列ヘッダーとサーバーの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ユーティリティは、1つ以上のファイルから列を生成します。デフォルトではタブで区切られていますが、次のように区切り文字を単一の文字に変更できます-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に展開するのではなく、1行ずつ正しく読みます。for

また、リモートホストで問題のファイルよりもcat複雑な操作を実行しようとしません。 localhostに移動され、grep一度だけ実行されます。

関連情報