Shell 脚本 - 在填充数据时我怎样才能有一段时间?

Shell 脚本 - 在填充数据时我怎样才能有一段时间?

你能帮我么?我感谢任何帮助!

我有这个文件:

[root@acnode1 tmp]# cat nodeidhost.out
               node_id                | hostname
 c31abf5a-ece5-4da5-afa3-1af4e19f9749 | acnode1.storagedomain
 c41bcebe-37a3-42ce-8ded-249b2726ca17 | acnode2.storagedomain
 5b00247c-f38c-4c8e-9835-a8b935549267 | acnode3.storagedomain
 10a69825-38d8-4675-b845-906d94a99ec8 | acnode4.storagedomain
 f2cb6d0f-54fa-4c70-ac02-65ff8aca9edc | acnode5.storagedomain

还有这个文件:

[root@acnode1 tmp]# cat nodeidversion.out
               node_id                | installed_version | available_version
 c31abf5a-ece5-4da5-afa3-1af4e19f9749 | 4.5.0-284         | 4.5.0-284
 c41bcebe-37a3-42ce-8ded-249b2726ca17 | 4.5.0-284         | 4.5.0-284
 5b00247c-f38c-4c8e-9835-a8b935549267 | 4.5.0-284         | 4.5.0-284
 10a69825-38d8-4675-b845-906d94a99ec8 | 4.5.0-284         | 4.5.0-284
 f2cb6d0f-54fa-4c70-ac02-65ff8aca9edc | 4.5.0-284         | 4.5.0-284

我试图在 while 内创建一段时间,因此在第一个“nodeidhost.out”加载 ID(第一列)和主机名(第二列)时,但我还需要检查文件“nodeidversion.out”以检查“installed_version”和“available_version”是什么并合并这些详细信息:

注意:“node_id”列是进行比较的“主密钥”:

while read nodeid; do
        node_id=`echo $nodeid | awk '{print $1}'`
        node_name=`echo $nodeid | awk '{print $3}' | cut -d"." -f1`
        .... second while checking 'installed_version' and 'available_version' from 'nodeidversion.out'
done < /tmp/nodeidhost.out

最后我需要类似的东西:

节点 XXXX 正在运行版本 YYYY,最新版本是 ZZZZ

你能帮我么?谢谢你!!

答案1

尝试使用嵌套的 while 循环手动解析文件会使生活变得过于复杂。满足join命令:

Usage: join [OPTION]... FILE1 FILE2
For each pair of input lines with identical join fields, write a line to
standard output.  The default join field is the first, delimited by blanks.
...

请参阅man join获取更多信息。解决您的问题的示例用法:

$ join -t'|' -j1 -o 1.2,2.2,2.3 --header nodeid* | column -s'|' -o' | ' -t
 hostname              |  installed_version  |  available_version
 acnode1.storagedomain |  4.5.0-284          |  4.5.0-284
 acnode2.storagedomain |  4.5.0-284          |  4.5.0-284
 acnode3.storagedomain |  4.5.0-284          |  4.5.0-284
 acnode4.storagedomain |  4.5.0-284          |  4.5.0-284
 acnode5.storagedomain |  4.5.0-284          |  4.5.0-284

标志说明:

  • -t'|'指定输入文件是用竖线分隔的。
  • -j1导致连接位于两个文件的第一个字段上。 (这里实际上是多余的,因为默认是在第一个字段上加入。)
  • -o 1.2,2.2,2.3指定文件 1 第 2 列的输出格式,后跟文件 2 中的第 2 列和第 3 列。
  • --header因为文件有标题......我认为这没有什么区别,但也没什么坏处。
  • | column ... (etc)只需进行一些后处理即可整理列对齐,因为连接会丢弃输入中的信息。

注意: join 命令确实假设输入已排序。使用排序命令对输入进行预处理。

答案2

如果节点对应于示例所示的匹配行,您可以使用 shell while 循环同时从两个文件中读取:

while
    IFS=$' \t|' read -r node1 host <&3
    IFS=$' \t|' read -r node2 ver1 ver2 <&4
do
    [[ "$node1" == "$node2" ]] || { echo "lines mismatched"; break; }
    echo "$node1 => $host => $ver1 => $ver2"
done 3<nodeidhost.out \
     4<nodeidversion.out

输出

node_id => hostname => installed_version => available_version
c31abf5a-ece5-4da5-afa3-1af4e19f9749 => acnode1.storagedomain => 4.5.0-284 => 4.5.0-284
c41bcebe-37a3-42ce-8ded-249b2726ca17 => acnode2.storagedomain => 4.5.0-284 => 4.5.0-284
5b00247c-f38c-4c8e-9835-a8b935549267 => acnode3.storagedomain => 4.5.0-284 => 4.5.0-284
10a69825-38d8-4675-b845-906d94a99ec8 => acnode4.storagedomain => 4.5.0-284 => 4.5.0-284
f2cb6d0f-54fa-4c70-ac02-65ff8aca9edc => acnode5.storagedomain => 4.5.0-284 => 4.5.0-284

否则,awk 是一个不错的选择

awk -F '[[:blank:]]+[|][[:blank:]]+' '
    FNR == 1 {next}
    NR == FNR {host[$1] = $2; next}
    $1 in host {printf "%s => %s => %s => %s\n", $1, host[$1], $2, $3}
' nodeidhost.out hostidversion.out

相关内容