0

私はこのようなファイルを持っています

開始---abcxyz

終了----efg123

参照----2345

Slack ---- lmnop

..... ......そして上記のフォーマットは次の「Start&Slack」の間に他のもので繰り返されます

「Start」「End」「Slack」のファイルから行をgrepしたいので、UNIXまたはAWKを使用してどのように行うことができますか。

-ありがとう

4

2 に答える 2

7

この質問は、2 つのマーカー間の行をエコーするか、複数の種類の行を出力するかの 2 つの異なる方法で読むことができます。


(たとえば)との の行が必要な場合は、「echo」変数を使用できます。StartEndawk

echo 'Start ---abcxyz
something goes here
and here
End ---- efg123
Ref ----2345
Slack---- lmnop' | awk '
    /^Start / { e = 1 }
              { if (e) { print } }
    /^End /   { e = 0 }
    '

出力は次のとおりです。

Start ---abcxyz
something goes here
and here
End ---- efg123

echo 変数eは最初は設定されていないため、ifステートメントは起動しません。awkで始まる行が表示されるたびStartに、echo 変数が true に設定されます。その場合、その時点からすべての行がエコーされます。

次に、 でawk始まる行をEnd検出すると、エコー フラグを false に戻し、それ以上の出力を防ぎます。

3 つのコマンドの順序をawk使用して、開始行と終了行も出力するかどうかを決定できます。たとえば、それらが必要ない場合は、最初と 3 番目のコマンド (開始と終了のコマンド) を入れ替えることができます。

echo 'Start ---abcxyz
something goes here
and here
End ---- efg123
Ref ----2345
Slack---- lmnop' | awk '
    /^End /   { e = 0 }
              { if (e) { print } }
    /^Start / { e = 1 }
    '

出力は次のとおりです。

something goes here
and here

開始、終了、スラックラインだけが必要な場合grepは、それを行うことができます:

echo 'Start ---abcxyz
something goes here
and here
End ---- efg123
Ref ----2345
Slack---- lmnop' | egrep '^Start |^End |^Slack'

出力は次のとおりです。

Start ---abcxyz
End ---- efg123
Slack---- lmnop
于 2012-07-26T00:49:56.160 に答える
1

私があなたの問題を理解している限り......これを試すことができます

入力ファイル

Start ---abcxyz

End ---- efg123

Ref ----2345

Slack---- lmnop

Some other text

Some other text

Some other text

Start ---osdidiu

End ---- llll

Ref ----234513

Slack---- lmnodsasdp

コード

 awk '$1 == "Start" || $1 == "End" || $1 == "Slack----" {print $0}' InputFile

出力

Start ---abcxyz
End ---- efg123
Slack---- lmnop
Start ---osdidiu
End ---- llll
Slack---- lmnodsasdp
于 2012-07-26T04:56:28.700 に答える