2012-11-21 174 views
1

我有大約600個文件命名爲他們有信息的機器的IP地址,並帶有.dgt擴展名。我試圖在這些文件中搜索參數,如果給定的參數是正確的,則從這些文件中提取2行。我使用的是aix控制檯,經過一番搜索後,我在這裏找到了sed命令。我給你留下一個我的搜索範例。多文件參數搜索bash

sed -n -e '/XP/,$p' 181* > machines1 

sed -e '/XP/,$d' 181* > machines1 

更具體地講,在diretory我有我所有的企業機器的文件列表,它是這樣的:

181xxxxxxxxx.dgt 
181xxxxxxxxx.dgt 
181xxxxxxxxx.dgt 
181xxxxxxxxx.dgt 

和它們包含類似這樣的信息:

MachineName= M125EEE 
... 
... 
... 
CurrentIP=XXX.XXX.XXX.XXX 
... 
... 
OS=XP 
... 
... 
... 

我試圖獲得所有已安裝XP的機器的列表,所以我試圖提取操作系統行和MachineName行,以便我可以獲得像這樣的文件...

MachineName= M125EEE 
OS=XP 
MachineName= M125EEE 
OS=XP 
MachineName= M125EEF 
OS=XP 
MachineName= M125EEG 
OS=XP 

回答

1

編輯:

這將做什麼要求,但simplier(短),比第1版:

sed -ne '/^MachineName=/h;/^OS=XP/{x;G;p}' 181*dgt >machines 

給同1以下的答案:

拳回答

This w烏爾德做的工作:

sed -ne '/^MachineName=/{h};/^OS=/{/=XP/!d;x;G;p;d;h}' 181*.dgt >machines 
cat machines 
MachineName= M125EEE 
OS=XP 
MachineName= M125EEE 
OS=XP 
MachineName= M125EEF 
OS=XP 
MachineName= M125EEG 
OS=XP 

,但如果你不需要每次打印OS=XP,因爲這是唯一的字符串匹配,你可以讓他們出來:

sed -ne '/^MachineName=/{h};/^OS=XP$/{g;p}' 181*.dgt >machines 
cat machines 
MachineName= M125EEE 
MachineName= M125EEE 
MachineName= M125EEF 
MachineName= M125EEG 

,如果你想只有機器名,但沒有MachineName=,你可以:

sed -ne '/^MachineName=/{s/^.*= *//;h};/^OS=XP$/{g;p}' 181*.dgt >machines 
cat machines 
M125EEE 
M125EEE 
M125EEF 
M125EEG 
+0

嗨,我測試了你的答案,所有我出來的是該命令無法解析。任何機會它是bash版本? – NmRfG

+0

什麼是你的環境(操作系統,版本...)我使用的是Debian,bash 4.1.5,sed 4.2.1,但是在4.2.20上測試過(使用sed 4.2.1),給出了相同的結果......也許如果是雙引號而不是單引號或sed腳本:'echo $'#!/ bin/sed -nf \ n \ n/^ MachineName =/{s /^.*= * //; h}; \ n/^ OS = XP $/{g; p}'> extract-os.sed','chmod + x extract-os.sed','./extract-os。sed 181 * dgt' –

+0

它作爲一個sed腳本,謝謝 – NmRfG

2

試試這個:

awk ' 
BEGIN{ FS=OFS="=" } 
{ map[FILENAME,$1] = $2 } 
END { 
    for (file in ARGV) { 
     if (map[file,"OS"] == "XP") { 
     tag="MachineName"; print tag, map[file,tag] 
     tag="OS";   print tag, map[file,tag] 
     tag="CurrentIP"; print tag, map[file,tag] 
     } 
    } 
} 
' 181* 

製作簡單的,明顯調整,以輸出值的任何你喜歡的...

1

它不像運行有效,因爲一些其他的解決方案,但對於這樣一個小的文件,這個簡單的理解解決方案可能是合適的:

grep -h MachineName $(grep -l OS=XP 181*)

grep -l表示只打印匹配文件的名稱。然後,我們使用這些文件名作爲文件列表來搜索MachineName行(-h表示禁止文件名)。

+0

測試和完美工作,只是增加了一個''machines1'',所以我可以通過FTP提取數據。 – NmRfG