使用 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

相关内容