以下はサンプルの.logファイルです(より多くの行がある可能性があります)。
2022 User abc (iii)
2023 defaa <party> ttt
2222221 User def (bbb)
20222 defaa <accoun> ttt
2222 User dddd (aaa)
3333 defaa <hahaha> jmd
User
&の間の行を選択したいと思います。ttt
これはログの5行から7行に似ており、このログにはUser
&で構成されている行がさらにある場合があります。ttt
User
ttt
だからあなたがファイルで繰り返されても、&の間のすべての行を取得する方法を知りたいです。
テキストUser
とttt
常に連続した行にあるわけではありません
予想出力:
abc (iii)
2023 defaa <party>
def (bbb)
20222 defaa <accoun>
入れ子になった場合は、次のようになります。
2022 User abc (iii)
2222221 User def (bbb)
20222 defaa <accoun> ttt
2023 defaa <party> ttt
予想出力:
def (bbb)
20222 defaa <accoun>
ユーザーとtttは決して同じ行にありません
答え1
マルチキャラクタのGNU awkの略語を使用することはあなたが望むものかもしれませんRS
。RT
\s
[:space:]
$ awk -v RS='\\s*ttt' 'RT && sub(/.*User\s*/,"")' file
abc (iii)
2023 defaa <party>
def (bbb)
20222 defaa <accoun>
部分一致を許可したくない場合は、User
周囲ttt
に単語の境界を追加してください。
awk -v RS='\\s*\\<ttt\\>' 'RT && sub(/.*\<User\>\s*/,"")' file
答え2
を使用すると、sed
アドレス範囲を選択してUser
予約ttt
済みスペースに収集できます。
sed '/User/,/ttt/!d;H;/User/h;/ttt/!d;x;s/.*User //;s/ttt.*//' yourfile
上海:
/User/,/ttt/
User
次の範囲まで行を選択しますttt
(入れ子になった場合に必要に応じて)。選択項目が反転!
してd
削除されます。したがって、この手順では、その範囲外のすべての行を削除します。残念ながら、User
ファイルの最後から最後までの最後の段落は次のとおりです。いいえ削除されたので、それを削除する方法が必要です。H
予約済みスペースにすべての行を追加している間/User/h
コピー行がUser
予約済みスペースに追加されるため、予約済みスペースにはUser
現在の行までのすべての行が含まれます。このようにして、新しいUser
行は期待どおりに入れ子になって以前のすべてを上書きします。/ttt/!d
なしのすべての行で実行を停止するため、ストレージスペースにttt`のすべての内容をttt
収集するまで出力は生成されません。User' to
- ただし、すべてをまとめたら、
x
バッファを変更してパターン空間の予約済み領域からその行を取得できます。 - それから
User
すべてを削除してくださいs/.*User //
ttt
次に始まるすべての項目を削除します。s/ttt.*//