2016-01-21 53 views
1

嗨我有一個相當大,但從我正在運行的鹽腳本凌亂的輸出。遍歷一個文件直到匹配並找到第二個不同的匹配,直到不匹配。重複,直到EOF

基本上我的乾淨的輸出是這樣的:

MINION:server1.xyz.com 
MINION:server2.xyz.com 
MINION:server3.xyz.com 
filer1:/vol/storagestuffs/volpath1 
filer1:/vol/storagestuffs/volpath2 
filer1:/vol/storagestuffs/volpath3 
filer1:/vol/storagestuffs/volpath4 
MINION:server4.xyz.com 
filer4:/vol/storagestuffs/volpath1 
MINION:server5.xyz.com 
MINION:server6.xyz.com 
MINION:server7.xyz.com 
filer3:/vol/storagestuffs/volpath1 

我想只是去返回他們之下他們之下和文件管理器的所有申報者的爪牙,我想獲得它格式化爲例如:

MINION:server3.xyz.com filer1:/vol/storagestuffs/volpath1 
MINION:server3.xyz.com filer1:/vol/storagestuffs/volpath2 
MINION:server3.xyz.com filer1:/vol/storagestuffs/volpath3 
MINION:server3.xyz.com filer1:/vol/storagestuffs/volpath4 
MINION:server4.xyz.com filer4:/vol/storagestuffs/volpath1 
MINION:server7.xyz.com filer3:/vol/storagestuffs/volpath1 

我看着if語句,遞歸報表等我要麼我不理解的bash遞歸性陳述或者那不是我想做的事情。我希望找到一種有效的方法,而不必多次掃描文件。

是否有一個棘手的方式來使用xargs?有什麼可以做到這一點的grep?

感謝您的幫助!

回答

2

您可以使用AWK:

awk '/^MINION:/{m=$0} /^filer/{print m, $0}' file 
MINION:server3.xyz.com filer1:/vol/storagestuffs/volpath1 
MINION:server3.xyz.com filer1:/vol/storagestuffs/volpath2 
MINION:server3.xyz.com filer1:/vol/storagestuffs/volpath3 
MINION:server3.xyz.com filer1:/vol/storagestuffs/volpath4 
MINION:server4.xyz.com filer4:/vol/storagestuffs/volpath1 
MINION:server7.xyz.com filer3:/vol/storagestuffs/volpath1 
+0

難道理所當然地認爲一個「文件管理器」行總是立即由MINION線(或其他「文件管理器」的行)開頭?如果是這樣的話,anubhava的腳本非常優雅 - 否則在其他情況下會失敗 - 儘管這在awk中也很容易修復。 –

+0

@DirkHerrmann:如果'MINION'和'filer'行之間存在一些隨機行,這個awk仍然可以工作 – anubhava

+0

這是行得通的! 你能解釋一下這裏發生了什麼嗎?我似乎沒有達到awk的能力...... – whoopn

2

一個bash唯一的解決辦法是:

minions_with_filers() 
{ 
    label=; 
    while IFS=: read -r a b; do 
     case $a in 
      MINION) 
       label=$a:$b 
      ;; 
      filer[0-9]*) 
       printf '%s %s:%s\n' "$label" "$a" "$b" 
      ;; 
     esac 
    done 
} 

雖然,@anubhava的解決方案將運行約10倍的速度。

用例:

$ minions_with_filers < foo.txt 
MINION:server3.xyz.com filer1:/vol/storagestuffs/volpath1 
MINION:server3.xyz.com filer1:/vol/storagestuffs/volpath2 
MINION:server3.xyz.com filer1:/vol/storagestuffs/volpath3 
MINION:server3.xyz.com filer1:/vol/storagestuffs/volpath4 
MINION:server4.xyz.com filer4:/vol/storagestuffs/volpath1 
MINION:server7.xyz.com filer3:/vol/storagestuffs/volpath1 
相關問題