我有一个名为“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