2014-09-10 269 views
0

我需要從通訊組列表中的幾個文件中刪除大約40封電子郵件。 一個地址可能出現在不同的文件中,需要從所有文件中刪除。 我在一個目錄中有幾個.sh文件,它們也有幾行。AIX中的文件中的最佳字符串替換

我在一對夫婦的測試文件做了這樣的事情:

find . -type f -exec grep -li ADDRESS_TO_FIND {} 2>/dev/null \; | xargs sed -i 's/ADDRESS_TO_REMOVE/ /g' * 

它工作正常,但一旦我嘗試在真正的文件,它需要很長的時間,只是坐在那裏。我需要在不同的服務器上運行這個,這是我想優化這個的主要原因。

我試圖運行是這樣的:

find . -type f -name '*sh' 2>/dev/null | xargs grep ADDRESS_TO_FIND 

,但將返回:

./FileContainingAddress.sh:ADDRESS_TO_FIND 

如何添加這樣的事情:

awk '{print substr($0,1,10)}' 

但要回報我在「:」之前的所有內容?

我可以做從那裏休息,但還沒有找到如何修剪一部分

+0

使用 找到解決方法awk -F:'{print $ 1}' 最終的命令是: 查找。-type f -name'* 1'2>/dev/null | xargs grep ADDRESS | awk -F:'{print $ 1}'| xargs sed -i's/ADDRESS // g'* – 2014-09-10 20:52:04

+0

是的,'awk -F:'{print $ 1}''會在冒號前面打印該部分,但是可以通過'-l'開關完全避免grep 。我認爲你的原創嘗試​​是符合正確道路的。應該刪除命令末尾的'* *,正如我在我的回答中提到的那樣。 – 2014-09-10 22:16:39

回答

0

你的問題找回來後,我發現了一些這可能非常重要:

find -type f -exec grep -li ADDRESS {} \; | xargs sed -i 's/ADDRESS/ /g' * 
# here! -----------------------------------------------------------------^ 

星號正在擴展,因此sed行正在目錄中的每個文件上運行。

假設這不是您的問題中的錯字,我相信這是您糟糕表現的根源。你應該刪除它!

2

您可以使用-exec作爲find斷言,只要你不使用多個文件+版本,這意味着你可以提供若干-exec條款每個將依賴於前一個的成功。這種風格將避免構建文件名列表,這使得它在名稱中帶有奇怪字符的文件面前更加健壯。

例如:

find . -type f -name '*sh' \ 
    -exec grep -qi ADDRESS_TO_FIND {} \; \ 
    -exec sed -i 's/ADDRESS_TO_FIND/ /g' {} \; 

你可能想提供地址作爲參數,而不必輸入兩次,除非你真的意味着兩種情況是不同的(ADDRESS_TO_FINDADDRESS_TO_REMOVE):

clean() { 
    find . -type f -name '*sh' \ 
     -exec grep -qi "$1" {} \; \ 
     -exec sed -i "s/$1/ /g" {} \; 
} 

(當心在參數clean/。我會離開使得sed更強大的練習。)

+0

+1我沒有意識到你可以鏈接'-exec'命令,非常整齊。雖然我猜你也可以用'find -print0'和'xargs -0'來處理有問題的文件名。 – 2014-09-10 22:19:29

+0

@TomFenech:'find -print0'和'xargs -0'不是Posix。無論如何,假設你有Gnu'find'和'xargs',你可以通過文件名進行初始查找,但是你仍然必須從'grep'輸出文件名。 Posix在'find'中說''print0''在這裏被考慮,但沒有被採用。使用null終止符意味着任何要處理find的-print0輸出的實用程序必須添加一個新的選項來解析它現在正在閱讀的空終止符。「確實。 '-exec .... {} +'表單是被採用的。 – rici 2014-09-10 22:29:26

+0

@TomFenech:'sed -i'也是非Posix,所以我不知道它在AIX上的工作原理。如果它的工作方式與Gnu版本相同,那麼您可以在我的答案中使用'{} +'作爲'-exec sed'子句,這樣會更有效一些,因爲它只會觸發一個'sed'。 – rici 2014-09-10 22:33:17