我正在编写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
我如何实现这一目标?
答案 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 .