2014-07-17 88 views
2

我遇到以下問題。如何通過使用grep獲取僅路徑的文件名

I'm做了類似的grep:

$命令= grep的-r -i --include = * CFG '主機{' /omd/sites/mesh/etc/icinga/conf.d/對象

我得到了以下的輸出:

/omd/sites/mesh/etc/icinga/conf.d/objects/testsystem/test1.cfg:define host{ 
/omd/sites/mesh/etc/icinga/conf.d/objects/testsystem/test2.cfg:define host{ 
/omd/sites/mesh/etc/icinga/conf.d/objects/testsystem/test3.cfg:define host{ 
... 

所有* .cfg文件保存。

隨着exec($command,$array)

我通過在陣列中的結果。

是否有可能只獲取grep-command的結果文件名。

我曾嘗試以下:

$Command= grep -l -H -r -i --include=*.cfg 'host{' /omd/sites/mesh/etc/icinga/conf.d/objects 

,但我得到了同樣的結果。

我知道在論壇上有類似的話題存在。(How can I use grep to show just filenames (no in-line matches) on linux?),但該解決方案不起作用。

使用「exec($ Command,$ result_array)」我嘗試獲取結果的數組。 提到的解決方案都可以工作,但我不能用exec()獲得結果陣列。

任何人都可以幫助我嗎?

回答

0

這應該工作:

grep -r -i --include=*.cfg 'host{' /omd/sites/mesh/etc/icinga/conf.d/objects | \ 
    awk '{print $1}' | sed -e 's|[^/]*/||g' -e 's|:define$||' 

awk部找到的第一個字段中它和sed命令剪掉路徑和:define

4

是否有可能只獲取由於grep命令而導致的文件名。

使用grep您需要-l選項才能顯示文件名。

使用find ... -execdir grep ... \{} +你可能會阻止顯示文件的完整路徑(這是你需要什麼?)

find /omd/sites/mesh/etc/icinga/conf.d/objects -name '*.cfg' \ 
    -execdir grep -r -i -l 'host{' \{} + 

此外,關於你問題的第二部分,以讀取結果一個命令到一個數組,你必須使用的語法:IFS=$'\n' MYVAR=($(cmd ...))

在這種特殊情況下(我格式化爲多行語句,以清楚地顯示該結構的e上的表達 - 當然,你可以寫爲「一個襯裏」):

IFS=$'\n' MYVAR=(
    $(
     find objects -name '*.cfg' \ 
        -execdir grep -r -i -l 'host{' \{} + 
    ) 
) 

你必須然後訪問結果數組MYVAR像往常一樣英寸雖然我而我測試(3輪在特定情況下的比賽):

sh$ echo ${#MYVAR[@]} 
3 
sh$ echo ${MYVAR[0]} 
./x y.cfg 
sh$ echo ${MYVAR[1]} 
./d.cfg 
sh$ echo ${MYVAR[2]} 
./e.cfg 
# ... 
+0

你建議的串行作品!謝謝。我還有一個問題: - 我嘗試以數組形式獲得結果 - 我試圖執行您的字符串,如下所示:$ shellCommand = find /omd/sites/mesh/etc/icinga/conf.d/objects -name' * .cfg'\ -execdir grep -r -i -l'host {'\ {} +
exec($ shellCommand,$ hostname); –

+1

@ThomasLang和其他回答者一樣,我錯過了問題的第二部分。也許你應該發佈兩個單獨的問題?無論如何,我已經修復了我的答案以添加該部分。希望這個幫助。 –

+0

在第二次看我的問題時,我看到我忘記了第二部分。所以我稍後添加了它。 我希望這不是讓人困惑。 –

5

還有一個更簡單的解決方案:

grep -l whatever-you-want | xargs -L 1 basename 

基本名是直接的解決方案獲得的文件名沒有路徑

+2

'xargs -n 1'也可以。不需要移位鍵。 :) –

相關問題