ループが機能しない、または機能しない場合、awk

ループが機能しない、または機能しない場合、awk

以下のソースファイルを解析しようとしています。 =====とENDTIMEの間のテキストを抽出しようとしています。以下のコードを別のブロックで使用しています。ただし、||を使用すると、複数のパターンをフィルタリングできません。ただし、awk ifブロックでシングルモードを使用すると、フィルタリングが可能です。誰かがこのコマンドにどのような問題があるのか​​教えてもらえますか?または、ブロックが機能しないのはなぜですか?

ソースファイル:

STARTTIME --- 2019/09/19 12:00:44
==================================================================
Processname                                Node   Status   QueueAv
==================================================================
RtpNm01                                   CE_01      run      full
RtpAcp01                                  CE_01      run      full
RtpDynManLite01                           CE_01      run      full
RtpDynLiteInc01                           CE_01      run      full
ENDTIME --- 2019/09/19 12:00:45
Expected Result:
RtpNm01                                   CE_01      run      full
RtpAcp01                                  CE_01      run      full
RtpDynManLite01                           CE_01      run      full
RtpDynLiteInc01                           CE_01      run      full

パスワード:

cat rtpServiceStatusrun | awk '/Processname\s*Node\s*Status\s*QueueAv/{
while (getline){
        if( $0 !~ /^====*/ || $0 !~ /^ENDTIME*/ ){
                        print $0
                }
        }
}'

ベストアンサー1

持つたくさんこれを行う方法は次のとおりです。

$ awk '/^ENDTIME/ {next}; NR>4' sourcefile 
RtpNm01                                   CE_01      run      full
RtpAcp01                                  CE_01      run      full
RtpDynManLite01                           CE_01      run      full
RtpDynLiteInc01                           CE_01      run      full

これにより、すべての入力行が印刷されます。後ろにで始まる行を除く4行目ですENDTIME

私の考えでは、これがブロックwhile (getline)の奇妙なループでやろうとしていることだと思い/Processname\s*....../ます。そうする必要はありません。 awkはすでに各入力ラインを介してループを実行し、現在の入力ライン番号(NR)値をテストできます。

そして:

awk '! /^(STARTTIME|ENDTIME|=====|Processname)/' sourcefile

grep -vE '^(STARTTIME|ENDTIME|=====|Processname)' sourcefile

sed -E -e '/^(STARTTIME|ENDTIME|=====|Processname)/d' sourcefile

これらはすべてすべての行を印刷します。いいえ正規表現を一致させます。両方とも、同じ拡張正規表現(ERE - と両方awkに対してデフォルトで有効になっています-E)を使用して行の先頭で置換(アンカー用)を見つけます。grepsed^

そして:

sed -e '1,4d; $d' sourcefile

最初から4番目と最後の行を削除します。

おすすめ記事