私はこのようなファイルを持っています
開始---abcxyz
終了----efg123
参照----2345
Slack ---- lmnop
..... ......そして上記のフォーマットは次の「Start&Slack」の間に他のもので繰り返されます
「Start」「End」「Slack」のファイルから行をgrepしたいので、UNIXまたはAWKを使用してどのように行うことができますか。
-ありがとう
この質問は、2 つのマーカー間の行をエコーするか、複数の種類の行を出力するかの 2 つの異なる方法で読むことができます。
(たとえば)との間 の行が必要な場合は、「echo」変数を使用できます。Start
End
awk
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
私があなたの問題を理解している限り......これを試すことができます
入力ファイル
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