在多个服务器中搜索字符串并放入文件中

在多个服务器中搜索字符串并放入文件中

大家好,我正在尝试搜索多个服务器(目前有 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;

我得到了带有字符串列表的文件 test(它是一个 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相关文件更复杂的操作。被grep移动到本地主机(并且仅执行一次)。

相关内容