读取文件的值,循环直到value = $ foo?

时间:2013-10-25 18:08:19

标签: bash loops

我正在编写一个grep为$foo的shell脚本,然后计算出现次数然后运行一个命令。每次运行该命令时,该文件中只有一个$ 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个实例。不确定最好的方法是什么。

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:0)

您可以在循环中添加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

答案 2 :(得分:0)

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

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

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

sed通常不会进行到位编辑。您通常必须写入另一个文件然后再移动。但是,某些sed命令可能具有此类参数。您可以查看您的管理。


第二次尝试

  

我认为它必须采取一些行动或执行一些处理或其他事情,其中​​一个影响是其中一个$ foos消失了。 (但我可能是错的。) - 昨天的直播

这是我在晚上回答这些问题的原因。

你可以利用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

优点是你只需要浏览一次文件(这可能是一个很长的操作)。但是,如果$foo位于多行上,则您的计数可能不正确。

一些注意事项:

  • $(...)优先于反叛
  • 设置变量时,不要在该变量前面使用美元符号。请注意,我有count=而不是$count=
  • 观看空间。 count= $(...)错了,因为等号后面有空格。