sedまたはawkを使用して単語に一致する段落を抽出する

sedまたはawkを使用して単語に一致する段落を抽出する

次のような「quota.txt」というファイルがあります。

DISK_info_start:/usr
Disk: /usr
CURRENT=81
DISK_info_end:/usr

DISK_info_start:/usr/var
Disk: /usr/tmp
CURRENT=1
DISK_info_end:/usr/var

次の変数があります。

entry=/usr

DISK_info_start:$entry から DISK_info_end:$entry に次のように段落を抽出したいと思います。

DISK_info_start:/usr
Disk: /usr
CURRENT=81
DISK_info_end:/usr

私は次のコマンドを試しました。

sed -n "\|DISK_info_start:$entry$|,\|DISK_info_end:$lines$|p" quota.txt

しかし、それは私が探しているものとまったく一致しません。

このコマンドを調整できますか?それとも代替案を提供できますか?

答え1

使用awk:

awk短絡モードで使用:

awk -v RS= '/DISK_info_start\:\/usr\n/' quota.txt

複数の段落が一致する場合は追加し、-v ORS="\n\n"そうでない場合はawk一致間の空白行を削除します。

\n代わりに行末を見つける必要があります$。後者は段落の終わりだけを表示するからです。

変数が必要な場合は、以下を引用してください/

entry=/usr
awk -v RS= "/DISK_info_start\:${entry//\//\\\/}\n/" quota.txt

使用perl:

perl短絡モード()もあります-00

perl -00 -ne '/DISK_info_start\:\/usr\n/ && print' quota.txt

| tr -s '\n'最後に空白行が印刷されるのを防ぐために追加されました。


使用sed:

sed次のように使用することもできます。

sed -n '/DISK_info_start:\/usr$/,/DISK_info_end:\/usr$/p' quota.txt

これは本当に見つかりません。しかし、あるゲームから別のゲームへ。

答え2

これを試してみてくださいawk。テキスト処理に最適です。

awk 'index($0, "DISK_info_start:"D"\n")==1' RS="" ORS="\n\n" D="/usr" quota.txt

DISK_info_start:/usr
Disk: /usr
CURRENT=81
DISK_info_end:/usr

答え3

あなたは試すことができます:grep -A3 DISK_info_start:$entry quota.txt

関連情報