2014-04-07 51 views
1

我試圖與UNIX機器上以下命令:如何獲取包含特定搜索字符串的文件名及其語句列表?

ls -l | awk '{print $9}' | xargs -I {} cat {} | grep {"String to search"} 

雖然這個作品與文本文件,但是當我用XML文件嘗試它,它是無法顯示正確的grepped text.Instead它顯示整個XML文件。

我認爲這背後的可能原因是缺乏我使用的xml文件中的新行字符。

實施例: 搜尋字符串:"/1031/"

的Xml線包含搜索字符串:<eventtype uri="{any_url}/1031/"/>

爲了澄清一下:

ls -l | awk '{print $9}' | xargs -I {} cat {} | grep -o "/1031"

這給出輸出爲:

/1031

/1031

/1031 ...

我也希望它所屬的文件的名稱。

+0

'grep'將打印相匹配的整行。 – fedorqui

+0

那麼你想知道的是如何控制'grep'的輸出? – Robin

回答

4

grep有一個標誌-o只輸出匹配的文本。

ls -l | awk '{print $9}' | xargs -I {} cat {} | grep -o {"String to search"} 

從您的編輯看起來您需要包含該URL的「行」。默認情況下,grep會匹配貪婪,這意味着XML格式的正則表達式仍然會給你一個不正確的結果。

我能想到的2種可能的選擇:

在接下來的實施例中,的test.xml包含字符串:

<eventtype uri="{www.example1.com}/1031/"/><eventtype uri="{www.example2.com}/1031/"/><eventtype uri="{www.example3.com}/1031/"/> 

第一種方法是使用-P標誌grep來使perl的語法和懶洋洋地搭配。

grep -Po '".*?/1031/"' test.xml 

此輸出:

"{www.example1.com}/1031/" 
"{www.example2.com}/1031/" 
"{www.example3.com}/1031/" 

第二種是用sed來手動附加每個匹配和管後換行到grep:

sed 's/1031/1031\n/g' test.xml | grep 1031 

輸出:

<eventtype uri="{www.example1.com}/1031 
/"/><eventtype uri="{www.example2.com}/1031 
/"/><eventtype uri="{www.example3.com}/1031 

我相信這兩種方法都可以d在純文本文件上工作正常,但您可能需要在.xml擴展名中有條件地使用這些方法之一。

+0

感謝您的幫助.. :) – gyan

1

親愛的你可以用下面的命令

find -type f -exec grep -HPo '".*?/1031/"' {} \; 

樣本輸出

[根@ MUM03S001〜]#找到型的F -exec grep的-HPo「」。*?/ 1031 /「'{} \;

./File:"{www.example1.com}/1031/ 「

./File:"{www.example2.com}/1031/」

./File:「{ www.example3.com}/1031 /」

[根@ MUM03S001〜]#

相關問題