쉘 스크립트 - 데이터를 채우는 동안 어떻게 시간을 보낼 수 있나요?

쉘 스크립트 - 데이터를 채우는 동안 어떻게 시간을 보낼 수 있나요?

도와주세요? 도움을 주셔서 감사합니다!

나는 이 파일을 가지고 있습니다 :

[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

만약에노드는 예제에 표시된 일치하는 행에 해당하며 쉘 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

관련 정보