【问题标题】:If grep fails delete the file如果 grep 失败删除文件
【发布时间】:2011-04-21 16:31:18
【问题描述】:

嘿,伙计们,我有这个小脚本,我需要对所有文件进行 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

.
.
.

【问题讨论】:

  • 为了清楚起见,我把 server1-24 放在这里是为了简化我的代码,实际上我的 24 个服务器中的每一个都有不同的主机名,这就是我需要服务器阵列的原因。
  • 您的echo Empty 有点混乱。您会意识到,如果您确实找到了关键字,您就会明白这一点,对吧?
  • 是的,这只是一种愚蠢而快速的方法,可以确保 if 语句有效并且如果找到关键字则不对文件执行任何操作,因为在这种情况下我想保留文件,我只想删除没有关键字的文件。

标签: bash scripting shell grep


【解决方案1】:

如果您让您的代码以下列方式之一为您执行此操作,则您不必确保您的计数匹配:

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 抑制错误消息。

【讨论】:

    【解决方案2】:

    你可以使用-l grep 选项

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

    【讨论】:

    • grep -l "KEYWORD" 目录/*.html | xargs -r rm -f
    • -L not -l 用于文件没有匹配
    • 当 :) 这是最好的答案,只要你合并了@pixelbeat 的两个 cmets。并且,根据OP的要求,将directory/server*html改成$server
    • 当然,xargs 可以使用。但我不会改变我的答案。因为我假设还需要进行一些其他处理。
    【解决方案3】:

    确保以下几点:

    • 将服务器名称分开 按空格排列的数组为:

      server=(server1 server2 server3 ... server24)

    • 有效索引从023 (比数组个数少一 元素)。
      所以你的 for 循环应该 是:

      for ((n=0; n &lt;= 23 ; n++)) 要么 for ((n=0; n &lt; 24 ; n++))

    【讨论】:

    • 实际上我确实需要这条线,因为我的每台服务器都有不同的主机名,我只是在 server1-24 中输入了用于简化代码。
    【解决方案4】:

    我建议您对每个文件执行 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
    

    【讨论】:

    • 这就是为什么它只是一个建议(它有助于提高可读性).. 大括号扩展修复了错误。
    【解决方案5】:
    #!/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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-13
      • 1970-01-01
      相关资源
      最近更新 更多