grep을 사용하여 호스트 이름을 구별하고 싶습니다. 2개의 파일이 있습니다. yaml 하나와 .pp 하나. yaml에는 ip가 포함된 도메인 이름이 있고 .pp 파일에는 해시 스타일 fqdn 및 ip가 있습니다. 이와 같이:
첫 번째 파일에는 호스트 목록이 있습니다.
{호스트=>호스트1,ip=xxxx},
{호스트=>호스트2,ip=xxxx},
두 번째 파일에는 다음과 같은 또 다른 호스트 세트가 있습니다.
호스트 1:
IP:xxxx
호스트 2:
IP:xxxx
먼저 첫 번째 파일의 호스트 목록을 가져오고 동시에 두 번째 파일의 호스트 목록을 가져오려고 했습니다. 첫 번째 파일의 호스트가 두 번째 파일에 있으면 건너뜁니다.
cat FILEONE.pp | grep 'host =>' | grep -v "cat FILETWO.yaml | grep '[0-9]:' | grep -v ip"
필터
"cat FILETWO.yaml | grep '[0-9]:' | grep -v ip"
역방향 grep을 수행하기 위해 플래그의 인수로 이전 grep에 전달하고 싶지만 -v
작동하게 할 수 없습니다...
즉석에서 만들 수 있나요?
이 문제는 다음과 같이 단순화될 수 있습니다.
어떻게 해야 하나요?
grep -v {cat file | command2 | command3 | command4}
두 번째 파일에 없는 경우 첫 번째 파일의 호스트만 포함하는 목록을 만들고 싶습니다. (첫 번째 파일에서 두 번째 파일의 호스트 제외)
답변1
어때요?
cat FILEONE.pp | grep "host = $(cat FILETWO.yaml | grep '[0-9]:' | grep -v ip)"
답변2
나는 이것이 당신이 필요로하는 방식으로 작동 할 것이라고 생각합니다 :
for host in $(awk '{print $3}' FILEONE.pp | sed "s/,//"); do grep -q $host FILETWO.yaml || echo $host; done
첫 번째 파일의 호스트 목록은 호스트가 두 번째 파일에 없는 경우에만 인쇄됩니다.
답변3
awk
다음 사항에 가장 적합합니다.
awk -F"[: ,]*" 'FNR==NR && /:$/ {a[$1]; next} $3 in a' f2 f1
호스트 이름을 저장하는 배열의 두 번째 파일을 반복하면 됩니다 a[]
. 그런 다음 첫 번째 파일을 반복하고 세 번째 필드가 배열에 있는지 확인합니다.
참고는 -F"[: ,]*"
필드 구분 기호를 :
, ,
또는 공백으로 설정하는 데 사용됩니다.
시험
다음 예제 파일이 제공됩니다.
$ cat f1
host = host1, ip = x.x.x.x
host = host2, ip = y.y.y.y
host = host3, ip = z.z.z.z
$ cat f2
host1:
ip: x.x.x.x
host3:
ip: x.x.x.x
출력을 봅니다.
$ awk -F"[: ,]*" 'FNR==NR && /:$/ {a[$1]; next} $3 in a' f2 f1
host = host1, ip = x.x.x.x
host = host3, ip = z.z.z.z