Linux
在多個伺服器中搜尋字元串輸出到文件中
嗨,伙計們,我正在嘗試搜尋多個伺服器(現在是 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
移動到本地主機(並且只執行一次)。