次の種類のテキストファイルがあります。
a b c d
-- -- -- --
1 ok device issue Some Action which
has to be taken which
is split into many lines
under d.
「問題」をgrepingしようとしましたが、「d」の最初の行だけが印刷されました。私が得た結果は次のとおりです。
1 ok device issue Some Action which
しかし、私はdの完全な出力が欲しい。ファイルをcsvとして保存しようとすると、d列の2行目が新しい行として表示されます。
編集する:
問題のあるデバイスを探す変数に格納されている複数のデバイスから出力を取得します。
答え1
これには複数行のgrepが必要です。これを行うには、PCREオプションを有効にする必要があります-P
。 grep は-z
slurp モードで Null で区切られたレコードを出力するため、tr コマンドを使用してこれらのレコードを削除します。
$ < file grep -Pzo '.*\S.*issue.*\n(?:\h+.*\n)+' | tr -d '\0'
答え2
grep
基本モードで正常に動作します。そのページからman
:
...grepは各ファイルからパターンを検索します。 PATTERNSは改行で区切られた1つ以上のパターンで、grepはパターンと一致する各行を印刷します。
だから現れるべきです。ワイヤー。regex
行は、newline
現在表示されている動作を説明する制御コードで区切られます。-z
答えに記載されているオプションを使用することに加えて。 「問題」が一致する正規表現である('Device Degraded'
または'\sDegraded'
実際に一致したい場合は置換)、'\sError'
「修正処置」列が機械で生成され、一貫していると仮定します。つまり、常に4行にわたっています。これは次のようにgrep -A 3 '\sissue' > issues
保存できます。単に走る興味のある路線のみファイルとして。次の出力を生成できるはずです。
1 ok device issue Some Action which
has to be taken which
is split into many lines
under d.
--
10 ok device issue Some Action which
has to be taken which
is split into may lines
under d.
--
211 ok device issue Some Action which
has to be taken which
is split into many lines
under d.
これらのオプションの詳細については、grepのマニュアルページをご覧ください。
答え3
入力ファイルの「レコード」がOPによって提供されたものとまったく同じであると仮定します。
$ sed '/issue/!d; :a; n; /^[0-9]\{1,\} /d; $!ba' file
1 ok device issue Some Action which
has to be taken which
is split into many lines
under d.
$
答え4
これはおそらく、すべてのUNIXシステムのすべてのシェルでawkを使用して欲しいものです。
$ cat tst.awk
/^[0-9]/ { prt() }
{ rec = rec $0 ORS }
END { prt() }
function prt() {
if ( rec ~ regexp ) {
printf "%s", rec
}
rec = ""
}
。
$ awk -v regexp='issue' -f tst.awk file
1 ok device issue Some Action which
has to be taken which
is split into many lines
under d.