助けてください?助けてくれてありがとう!
私はこのファイルを持っています:
[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(最初の列)とホスト名(2番目の列)がロードされますが、「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
もしノードは例に示されている一致する行に対応し、シェルの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