2012-12-22 69 views
1

bash大師;)我試圖改善一些字符串在特定的文件grep特定關鍵字的匹配bash。它看起來像這樣:grep東西與xargs和發現

find /<path>/hp -iname '*.ppd' -print0 | xargs -0 grep "\*ModelName\:" 

這對我來說工作非常快!在比快20倍這一個:

find /<path>/hp -iname '*.ppd' -print0 | xargs -0 -I {} bash -c 'grep "\*ModelName\:" {}' 

但問題是,在第一個劇本,我發現了以下幾行:

/<path>/hp/hp-laserjet_m9040_mfp-ps.ppd:*ModelName: "HP LaserJet M9040 M9050 MFP" 

但期望的結果僅僅是

*ModelName: "HP LaserJet M9040 M9050 MFP" 

(如第二個腳本)。我怎樣才能實現它?

P.S .:我使用find爲腳本的靈活性和未來的改進。

+0

我不明白,爲什麼你把居間'慶典'在你的第二個命令。 – kmkaplan

+0

即使沒有明確調用干預bash,它也會以相同的速度運行:find//hp -iname'* .ppd'-print0 | xargs -0 -I {} grep「\ * ModelName \:」{}。 – likern

回答

4

-h選項到grep可抑制輸出中的文件名。

find /<path>/hp -iname '*.ppd' -print0 | xargs -0 grep -h "\*ModelName\:" 

如果您grep不提供-h使用cat

find /<path>/hp -iname '*.ppd' -print0 | xargs -0 cat | grep "\*ModelName\:" 

此外,對於您的信息,find提供-exec選項,它會使xargs不必要了,你想追求你的第二個選項:

find /<path>/hp -iname '*.ppd' -exec grep grep "\*ModelName\:" '{}' \; 
+0

太好了,非常感謝!我沒有認出這個選擇。 – likern

+0

他也在談論速度。 -exec將使其運行速度變慢,但它確實解決了文件名問題 – kdubs

+0

如果我使用'find ... -print0 | xargs -0'? find -exec'找到哪些問題找不到...... -print0 | xargs -0'?也許我的代碼很容易出錯? – likern

1

你可以擺脫共找到(在bash):

shopt -s globstar 
grep -h "\*ModelName\:" /<path>/hp/**.[pP][pP][dD] 

可能會有點慢,如果你有一個巨大的目錄樹(這是我在你的情況下,懷疑)。

  • 臨:只有一個進程啓動! Con:你提到的未來改進可能會更難實現。

在這種情況下,你最好使用:

find /<path>/hp -iname '*.ppd' -exec grep -h "\*ModelName\:" {} + 

(觀察+末:只有一個grep將陸續推出)。

5

無需find

grep -rh --include "*.ppd" "\*ModelName\:" 
0

你的輸出線

/<path>/hp/hp-laserjet_m9040_mfp-ps.ppd:*ModelName: "HP LaserJet M9040 M9050 MFP" 

由一個冒號分隔三個字段中記錄的思考。如果你這樣想你的輸出線,那麼你想提取第三個字段作爲你的最終答案。如果你不知道AWK什麼,你應該知道,至少是如何使用特定的列分隔符來打印輸出數據的列,因爲我下面展示你:

find /<path>/hp -iname '*.ppd' -print0 | xargs -0 grep "\*ModelName\:" | awk -F:'{ print $3}' 

你應該另一件事瞭解AWK是如何總結(偶爾,取平均值)的輸出數據的特定列中的數字,但這是另一天:)

追加AWK的優點另一個故事對你的命令鏈的命令是你正在建立並利用速度您優化的命令鏈:)

在你的情況下的表現,答案是的grepxargs的找到AWK :)