여러 파이프를 제외하는 grep을 만드는 방법은 무엇입니까?

여러 파이프를 제외하는 grep을 만드는 방법은 무엇입니까?

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

관련 정보