以下のソースファイルを解析しようとしています。 =====と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
)を使用して行の先頭で置換(アンカー用)を見つけます。grep
sed
^
そして:
sed -e '1,4d; $d' sourcefile
最初から4番目と最後の行を削除します。
答え2
1つのオプション:
cat file | head -n -1 | tail -n +5
答え3
(&&)を追加するために、または(||)を変更して機能し始めました。
cat rtpServiceStatusrun | awk '/Processname\s*Node\s*Status\s*QueueAv/{
while (getline){
if( $0 !~ /^====*/ && $0 !~ /^ENDTIME*/ ){
print $0
}
}
}'