2015-11-27 68 views
3

我正在編寫bash腳本以將頻道從一個衛星複製到另一個衛星。僅列出紅帽衛星子頻道,每個基地頻道

我想僅獲取基本頻道的子頻道列表: clone-rhel-x86_64-server。

我有意使用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 

我的目的是去獲得唯一的第一部分,即只有子頻道。

對於基本信道:克隆RHEL-x86_64的服務器

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

我投票關閉這一問題作爲題外話,因爲這是最適合對於Unix和Linux SE! –

+0

http://unix.stackexchange.com/ – Drew

+5

雖然這個問題適用於Unix和Linux,它*是一個bash問題,所以它也是在這裏的話題。 –

回答

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 . 
+0

謝謝你的回答,但實際上我得到了相同的結果:rhn-satellite-exporter --list-channels | grep -E -A10'(^ |)clone-rhel-x86_64-server(| $)'| grep -v「^ B 「| perl的-00ne '打印;出口' çchild_channel1 çchild_channel2 çchild_channel3 çchild_channel4 çchild_channel5 çchild_channel7,我已經嘗試了所有的選項.. –

+0

@Max_il什麼操作系統? – terdon

+0

喜terdon,操作系統是:紅帽企業Linux服務器版本6.6 –