解析する必要がある多数の行を出力するコマンドがあります。
出力は次のとおりです。
PORT-A 3 HOSTNAME PRODUCT1 14 29
PORT-B 7 HOSTNAME PRODUCT2 22 18 41
PORT-C 9 HOSTNAME PRODUCT2 22 18 41
PORT-D 4 HOSTNAME PRODUCT1 14
PORT-B 2 HOSTNAME PRODUCT1
sed -nr '/PRODUCT1|14|29/p'
各パターンに合ったラインだけを印刷してみました。
以下を使用して出力sed -nr '/PRODUCT1|14|29/p'
:
PORT-A 3 HOSTNAME PRODUCT1 14 29
PORT-D 4 HOSTNAME PRODUCT1 14
PORT-B 2 HOSTNAME PRODUCT1
sed
3つのパターンのいずれかが欠落している場合にのみ、この行を印刷したいと思います。これを達成する方法についてのアイデアはありますか?
理想的な出力:
PORT-D 4 HOSTNAME PRODUCT1 14
PORT-B 2 HOSTNAME PRODUCT1
答え1
これは簡単にできるとは思えませんsed
。あなたの要件を正しく理解したら、3つのパターンのうちの1つが正確に一致せず、2つのパターンが一致しない場合は、次の行を印刷したいと思います。するマッチ。 sed では、3 つの実行パスが必要です。いずれの場合も、2つのパターンがそれぞれ正常に一致していることをテストし、3番目のパターンが正常に一致していることをテストする必要があります。
完全性のために、次のsed
スクリプトはユーザーが必要とするタスクを実行します。
sed -nr '/PRODUCT1/{/14/{/29/!p}};/14/{/29/{/PRODUCT1/!p}};/PRODUCT1/{/29/{/14/!p}}'
これはO(n ^ 2)の複雑さで正規表現一致を実行します。より多くのフィールドをテストするためにパターンを追加すると、扱いにくくなります。
awk
perl
カウンタ変数を実装できる場所でこのようなことを行う方が良いかもしれません。これらの言語では、各パターンがテストされ、一致するとカウンタが増加し、テストされた各パターンに対して異なるカウンタが増加します。一致カウンタがパターンカウンタよりも1つ少ない場合は、その行を印刷します。