2010-10-06 52 views
1

Heya傢伙,我有這個小腳本,我需要grep所有的文件,只留下那些包含關鍵字,我堅持這一點,任何幫助指出我的愚蠢的錯誤認識:)如果grep失敗刪除文件

#!/bin/bash 

server=(server1...server24) 

. 
. 
. 

for ((n=0; n <= 24 ; n++)) 
do 
     if grep -q "KEYWORD" directory/${server[$n]}.html ; then 
       echo Empty 
     else 
       rm -f directory/${server[$n]}.html 
     fi 
done 

. 
. 
. 
+0

爲了清楚起見,我在這裏放置了server1-24以簡化我的代碼,實際上我的每臺服務器都有不同的主機名,這就是爲什麼我需要服務器陣列。 – f10bit 2010-10-06 09:14:37

+0

你的'echo Empty'有點混亂。你意識到如果你找到了你的關鍵詞,你會得到的,對吧? – 2010-10-06 09:24:55

+0

是的,這只是一個愚蠢而快速的方式來確保if語句的工作原理,如果它找到關鍵字,不會對文件做任何事情,因爲在那種情況下,我想保留文件,我只想刪除那些沒有關鍵字的人。 – f10bit 2010-10-06 09:31:55

回答

2

您不必以確保您的數相符,如果你讓你的代碼爲你做它以下列方式之一:

servers=(foo bar baz) 
for server in ${servers[@]} 
do 
    if ! grep -qs "KEYWORD" directory/$server.html 
    then 
     rm ... 

servers=(foo bar baz) 
for ((n = 0; n < ${#servers[@]}; n++)) 
do 
    if ! grep -qs "KEYWORD" directory/${servers[$n]}.html 
    then 
     rm ... 

使用!來反轉條件,使其成爲「如果文件不包含關鍵字,則將其刪除」。

使用grep選項-q來清除輸出,並使用-s來抑制錯誤消息。

1

您可以使用-l選項的grep

grep -l "KEYWORD" directory/server*html | while read -r FOUND 
do 
    rm -f ..... 
    do some other processing here..... 
done 
+2

grep -l「KEYWORD」目錄/ *。html | xargs -r rm -f – pixelbeat 2010-10-06 10:23:44

+2

-L沒有-l對於文件_without_不匹配 – pixelbeat 2010-10-06 10:30:26

+0

Dang :)這是最好的答案,只要你同時包含@ pixelbeat的註釋。而且,根據OP的要求,將'directory/server * html'更改爲'$ server'。 – Amadan 2010-10-06 11:20:27

1

確保以下幾點:

  • 由空格分隔 陣列中的服務器名稱爲:

    server=(server1 server2 server3 ... server24)

  • 的有效索引是從023 (一個小於陣列 元素的數量)。
    所以你的for循環應該 是:

    for ((n=0; n <= 23 ; n++))for ((n=0; n < 24 ; n++))

+0

實際上我確實需要這條線,因爲我的每個服務器都有不同的主機名,我只是放在server1-24中以簡化代碼。 – f10bit 2010-10-06 09:13:03

0

我建議你爲每個文件做的grep,然後測試退出狀態$? - 和解決您的括號擴展。

所以......

for ((n=0; n <= 24 ; n++)) 
    do 
     grep -q "KEYWORD" directory/server${n}.html 
     if [ $? -eq 0 ] then 
      echo "directory/server${n}.html - Has keyword" 
     else 
      rm -f directory/server${n}.html 
     fi 
    done 
+1

這正是'如果grep ...;那麼'已經在做。 – Nefrubyr 2010-10-06 09:03:49

+0

這就是爲什麼它只是一個建議(它有助於可讀性)。大括號擴展修復了錯誤。 – ocodo 2010-10-06 12:25:26

0
#!/usr/bin/env bash 

server=(server{1..24}) 

for((n=0; n<24; n++)) 
do 
    if grep -q 'keyword' ${server[$n]}; then 
     echo Empty 
    else 
     rm -f ${server[$n]} 
    fi 
done