Bash スクリプトヘルプ - テキストの解析と出力

Bash スクリプトヘルプ - テキストの解析と出力

次の種類のテキストファイルがあります。

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 は-zslurp モードで 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.

関連情報