複数のパイプを除外するgrepを作成する方法は?

複数のパイプを除外するgrepを作成する方法は?

grepを使ってホスト名を区別したいです。 2つのファイルがあります。 yaml一つと.pp一つ。 yamlにはipを含むドメイン名があり、.ppファイルにはハッシュスタイルfqdnとipがあります。このように:

最初のファイルにはホストのリストがあります。

{ホスト=>ホスト1、ip=xxxx}、

{ホスト=>ホスト2,ip=xxxx},

2番目のファイルには、次の別のホストセットがあります。

ホスト1:

IP:xxxx

ホスト2:

IP:xxxx

まず、最初のファイルのホストリストをインポートし、同時に2番目のファイルのホストリストをインポートしようとしました。最初のファイルのホストが2番目のファイルにある場合はスキップします。

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}

2番目のファイルにない場合は、最初のファイルのホストのみを含むリストを作成したいと思います。 (最初のファイルから2番目のファイルのホストを除く)

答え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

最初のファイルのホストリストは、ホストが2番目のファイルにない場合にのみ印刷されます。

答え3

awk以下に最適です。

awk -F"[: ,]*" 'FNR==NR && /:$/ {a[$1]; next} $3 in a' f2 f1

ホスト名を格納する配列の2番目のファイルを繰り返すだけですa[]。次に、最初のファイルを繰り返し、3番目のフィールドが配列にあることを確認します。

注は、-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

関連情報