仅列出基本频道

时间:2015-11-27 19:35:15

标签: linux bash

我正在编写bash脚本,用于将频道从一个卫星复制到另一个卫星。

我想只获取基本频道的子频道列表: 克隆RHEL-x86_64的服务器。

我故意使用grep -E -A10来提供选项输出 最多10个子频道。

现在我得到了:

rhn-satellite-exporter --list-channels |grep -E -A10 '(^| )clone-rhel-x86_64-server( |$)'|grep  -v "^B"
C       child_channel1
C       child_channel2
C       child_channel3

C       child_channel4
C       child_channel5
C       child_channel7

我的目的只是获取第一部分,即只有儿童频道。

对于基本频道:clone-rhel-x86_64-server

rhn-satellite-exporter --list-channels |grep -E -A10 '(^| )clone-rhel-x86_64-server( |$)'|grep  -v "^B"
C       child_channel1
C       child_channel2
C       child_channel3

我如何实现这一目标?

1 个答案:

答案 0 :(得分:2)

执行此操作的一种方法是使用perl段落模式。来自man perlrun

   -0[octal/hexadecimal]
        specifies the input record separator ($/) as an octal or
        hexadecimal number. [. . .]
        The special value 00 will cause Perl to slurp files in paragraph
        mode.  [. . .]

在段落模式中,"行"由\n\n而不是\n单独定义,因此每个"行"实际上是一个段落。因此,您可以使用Perl单行并告诉它打印第一行并退出:

rhn-satellite-exporter --list-channels |
    grep -E -A10 '(^| )clone-rhel-x86_64-server( |$)'| grep  -v "^B" |
        perl -00ne 'print;exit'

请注意,上面也会打印空行,因为它被认为是段落的一部分。为避免这种情况,您可以解析它:

 rhn-satellite-exporter --list-channels |
    grep -E -A10 '(^| )clone-rhel-x86_64-server( |$)'| grep  -v "^B" |
        perl -00ne 'print;exit' | grep .

或者在Perl脚本中删除它:

 rhn-satellite-exporter --list-channels |
    grep -E -A10 '(^| )clone-rhel-x86_64-server( |$)'| grep  -v "^B" |
        perl -00ne 's/\n\s*\n/\n/;print;exit' | grep .