【问题标题】:Read file for value, loop until value = $foo?读取文件的值,循环直到 value = $foo?
【发布时间】:2013-10-25 18:08:19
【问题描述】:

我正在编写一个 shell 脚本,用 greps 搜索 $foo 然后计算出现次数,然后运行命令。每次运行该命令时,该文件中都会少一个 $foo 实例。不确定如何连续读取该文件并减少我设置的变量中的值。

$count= `grep -o $foo /some/file |wc -w`

until [ $count -eq 0 ] 
do
  some_command_that_deletes_foo_in_file
done

但是我意识到$count 在运行时设置了一次并且没有更新。我想要的是将$count 更新为/some/file 中的当前计数,同时脚本循环通过/some/file,直到有0 个我正在寻找的短语实例。不确定最好的方法是什么。

【问题讨论】:

  • count=$(grep -c $foo /some/file)

标签: bash loops


【解决方案1】:

除非您有其他未向我们展示的依赖于$count 的代码,否则您实际上不需要计算出现次数;您只需要知道字符串是否出现在文件中。为此,您可以编写:

while grep -q -- "$foo" /some/file ; do
  some_command_that_deletes_foo_in_file
done

(使用 grep 在找到值时返回成功,在未找到时返回失败的事实,并使用 -q 标志来抑制其控制台输出)。

【讨论】:

  • -q 还会导致它在返回匹配项后停止读取文件,这比计数更有效。
【解决方案2】:

您可以在循环中添加 grep 命令:

count=$(grep -o "$foo" /some/file |wc -w)

until (( count == 0 )) 
do
  some_command_that_deletes_foo_in_file
  count=$(grep -o "$foo" /some/file |wc -w)
done

【讨论】:

    【解决方案3】:

    您只是想删除字符串“$foo”?使用 sed:

    sed "/$foo/d" /some/file > /some/other/file
    

    sed 命令是一个编辑器。 /$foo/ 采用正则表达式(无论$foo 的值如何),在文件中找到它。 d 告诉它删除该行。

    sed 通常不会进行就地编辑。您通常必须先写入另一个文件,然后再进行移动。但是,一些sed 命令可能有这样的参数。你可以检查你的管理。


    第二次尝试

    我认为它必须采取一些行动或执行一些处理或某事,其影响之一是 $foos 之一消失了。 (但我可能是错的。) – ruakh 昨天

    这就是我晚上回答这些问题的结果。

    您可以利用 grep 返回 true(即退出值 = 0)这一事实,如果它可以找到您的正则表达式和 false(即退出值不等于 0) 否则:

    while grep -o -q "$foo" "/some/file"
    do
        some_command_that_deletes_foo_in_file
    done
    

    -q 告诉 grep 不要输出任何内容。相反,如果找到字符串,grep 的退出值将是 true,如果没有找到,则为 false

    grep 上阅读您的联机帮助页。一些grep 命令没有-q 参数。在这种情况下,您需要将 STDOUT 和 STDERR 都重定向到 /dev/null

    另一种技巧可能是计算行数,然后将其用作计数器:

    count=$(grep -o "$foo" "/some/file" | wc -w)  # $(...) is the preferred syntax over `...`
    
    for loop in {1..$count}
    do
        some_command_that_deletes_foo_in_file
    done
    

    优点是您只需对文件进行一次 grep(这可能是一个很长的操作)。但是,如果 $foo 不止一行,则您的计数可能不正确。

    几点说明:

    • $(...) 优于反引号
    • 设置变量时,不要在该变量前面使用美元符号。注意我有count= 而不是$count=
    • 监视空间。 count= $(...) 错误,因为等号后面有一个空格。

    【讨论】:

    • OP 的解释,“每次运行该命令时,该文件中的 $foo 实例都会减少一个”,并没有向我暗示它删除$foo 的一个实例;相反,我认为它必须采取一些行动或执行一些处理或某事,其影响之一是$foos 之一消失了。 (但我可能是错的。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 2021-04-16
    • 1970-01-01
    相关资源
    最近更新 更多