Linux

在多個伺服器中搜尋字元串輸出到文件中

  • July 13, 2021

嗨,伙計們,我正在嘗試搜尋多個伺服器(現在是 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/name 和 DB SID 名稱:(像這樣)

Server        DB_SID_Name
192.168.2.1   DB_SID1
192.168.2.2   DB_SID2
192.168.2.3   DB_SID3

問候

缺口

$ 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相關文件更複雜的事情。被grep移動到本地主機(並且只執行一次)。

引用自:https://unix.stackexchange.com/questions/658253