仅当此部分包含使用bash的特定关键字时,才打印两个字符串之间的多行部分?

时间:2015-06-01 12:54:17

标签: bash

我有一个名为animals的文件,其中包含以下条目:

$ cat animals
name: elephant
class: mammal
habitat: India

name: Baltic herring
class: fish
habitat: Baltic sea

name: wolf
class: mammal
habitat: Sweden

name: eagle
class: bird
habitat: USA
$ 

如上所示,此文件包含四个部分。我想打印出那些包含字符串mammal的部分,我想在bash中执行此操作,即不使用sedawk。我是这样做的:

$ cat animals | while read -r line; do
>   if [[ "$line" =~ ^name ]]; then
>     section="$line"
>     while read -r line2; do
>       if [[ "$line2" =~ ^$ ]]; then
>         break
>       else
>         section+=$'\n'"$line2"
>       fi
>     done
>   echo "$section" | grep -q mamm && echo "$section"$'\n' ; section=
>   fi
> done
name: elephant
class: mammal
habitat: India

name: wolf
class: mammal
habitat: Sweden

$ 

然而,在bash中实现这一点是否有更优雅(更短且不那么繁琐)的方式?或者这是一个应该考虑像awk这样的工具的点?

2 个答案:

答案 0 :(得分:1)

如何简单,

grep mammal -C 1 --group-separator="" animals

答案 1 :(得分:1)

是的,你应该看看awk。它允许您更简单地执行此操作:

awk -v RS= -v ORS='\n\n' '/mammal/' file

这会取消记录分隔符,以便将每个块视为单个记录。然后打印每个匹配“哺乳动物”模式的记录,然后打印两个换行符,产生与问题中显示的输出相同的输出。