2010-10-06 53 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