출력 파일의 문자열 값을 소스 파일의 문자열로 바꿉니다.

출력 파일의 문자열 값을 소스 파일의 문자열로 바꿉니다.

이러한 값, 특히 파일 하단에 이름이 지정된 기존 파일의 " " 기호와 콜론 " " =사이의 값을 바꿔야 합니다. 즉,:zoo.cfg

...
Server.1=10.42.227.70:2891:3881
Server.2=10.42.229.63:2891:3881
Server.3=10.42.234.18:2891:3881
...

호스트 파일(즉, 소스 파일)의 값을 사용합니다.

10.42.227.66    zoo1
10.42.229.119   zoo2
10.42.234.21    zoo3

누구든지 이 작업을 수행하는 방법을 안내해 줄 수 있나요?

또한, Zoo.cfg 파일의 Server.1은 Zoo1과 동일하고, Server.2는 Zoo2와 동일하며, Server.3은 Zoo3과 동일합니다.

문제를 더하자면, 호스트 파일에는 여러 다른 호스트(예: Zoo1, Zoo2 및 Zoo3 이외의 호스트)에 대한 항목이 있습니다. Hosts 파일의 내용은 다음과 같습니다.

10.42.224.153 dev.nifi1.datacond.dfc
10.42.229.87 dev.nifi2.datacond.dfc
10.42.236.46 dev.nifi3.datacond.dfc
10.42.231.56 zoo1
10.42.224.225 zoo2
10.42.239.41 zoo3
10.42.233.198 controlnode
10.42.231.56 node-master
10.42.230.71 node1
10.42.237.120 node2

Zoo 호스트 행만 처리되도록 awk 스크립트를 수정하는 방법이 있습니까? 즉, 다른 모든 호스트 항목은 무시됩니까?

답변1

awk를 사용하십시오.

$ cat tst.awk
NR == FNR {
    map[$2] = $1
    next
}
FNR == 1 {
    tgt = FILENAME
    sub(/\.[^.]*$/,"",tgt)
}
{
    key = $1
    sub(/=.*/,"",key)
    sub(/.*\./,"",key)
    key = tgt key
}
key in map {
    sub(/=[^:]+/,"=" map[key])
}
{ print }

$ awk -f tst.awk hosts zoo.cfg
...
Server.1=10.42.231.56:2891:3881
Server.2=10.42.224.225:2891:3881
Server.3=10.42.239.41:2891:3881
...

위의 예제에서는 첫 번째 필드에 s가 host포함되어 있지 않으며 필드에 공백이 포함되어 있지 않다고 가정합니다.&

위의 내용은 다음 입력 파일에서 실행되었습니다.

$ head -50 hosts zoo.cfg
==> hosts <==
10.42.224.153 dev.nifi1.datacond.dfc
10.42.229.87 dev.nifi2.datacond.dfc
10.42.236.46 dev.nifi3.datacond.dfc
10.42.231.56 zoo1
10.42.224.225 zoo2
10.42.239.41 zoo3
10.42.233.198 controlnode
10.42.231.56 node-master
10.42.230.71 node1
10.42.237.120 node2

==> zoo.cfg <==
...
Server.1=10.42.227.70:2891:3881
Server.2=10.42.229.63:2891:3881
Server.3=10.42.234.18:2891:3881
...

관련 정보