grep匹配以空格开头的以下行

时间:2016-07-05 12:04:41

标签: bash awk sed grep

问题

假设我有一个包含以下内容的文件:

$newsheet -> getProtection() -> verifyPassword('MyPassword');

我希望以“lmtp_bind_address6”开头,以及以空格开头的所有后续行:

lmtp_bind_address (default: empty)
       The LMTP-specific version of the smtp_bind_address configuration parameter.  See there for details.

       This feature is available in Postfix 2.3 and later.

lmtp_bind_address6 (default: empty)
       The LMTP-specific version of the smtp_bind_address6 configuration parameter.  See there for details.

       This feature is available in Postfix 2.3 and later.

lmtp_body_checks (default: empty)
       The LMTP-specific version of the smtp_body_checks configuration parameter. See there for details.

       This feature is available in Postfix 2.5 and later.

如何在bash中执行此操作?

背景资料

我正在离开Centos 7并在Debian 8上设置Postfix。因此,我打算阅读“man 5 postconf”,它是Postfix版本2.11.3的7255行。为了加快速度,我想在手册页中对Postfix选项进行分组,但是对于不同的协议,例如:

lmtp_bind_address6 (default: empty)
       The LMTP-specific version of the smtp_bind_address6 configuration parameter.  See there for details.

       This feature is available in Postfix 2.3 and later.

正如您在上面所看到的,这四个选项中的每一个都可以选择TLS密码,但是对于不同的协议(SMTPD,LMTP等)。

首先,我按照以下方式对Postfix选项进行分组:

smtpd_tls_mandatory_ciphers
lmtp_tls_mandatory_ciphers
smtp_tls_mandatory_ciphers
tlsproxy_tls_mandatory_ciphers

然后,我将联机帮助页面转储到文件中:

postconf | awk -F"=" '{print $1}' | sed 's/ //g' | rev | sort | \
rev > postconf_options.txt

现在,我想通过分组列表并将每个匹配转储到以下行,以空白开头,转到第三个文件:

man 5 postconf > postconf_manpage.txt

上面的grep命令只给出了匹配的行,但不是以空格开头的以下行。

解决方案

我使用sed的双引号以便能够使用变量。以下是hek2mgl解决方案的完整程序:

cat postconf_options.txt | while read I; do
  grep -w "^$I" postconf_manpage.txt
done > postconf_manpage_grouped.txt

2 个答案:

答案 0 :(得分:2)

我会使用sed

sed -n '/^lmtp_bind_address6/{p;:a;n;/^[[:space:]]\|^$/{p;ba}}' file
  • /^lmtp_bind_address6/匹配搜索模式
  • {p;:a;n;/^[[:space:]]\|^$/{p;ba}}会使用p打印该行,定义一个标签:a,用作跳转标记,以便能够以空格开头的行进行迭代。 n将读取另一行到模式缓冲区。 /^[[:space:]]\|^$/匹配以空格为空的行开头。如果是这种情况,则会使用p打印该行,然后我们将使用a跳回ba

答案 1 :(得分:1)

  

我希望以" lmtp_bind_address6"开头的行开头以及以空格开头的所有后续行

你可以使用这个awk:

awk 'p && /^[^[:blank:]]/{p=0} /^lmtp_bind_address6/{p=1} p' file

lmtp_bind_address6 (default: empty)
       The LMTP-specific version of the smtp_bind_address6 configuration parameter.  See there for details.

       This feature is available in Postfix 2.3 and later.
  • /^lmtp_bind_address6/{p=1}在第一行找到所需模式时设置p=1
  • p && /^[^[:blank:]]/{p=0}在设置p=0时以及在第一行找到非空白字符时重置p