次のような「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