如何grep和执行命令(对于每个匹配)

时间:2012-11-15 16:37:42

标签: grep

如何在一个文件中grep并为每个匹配执行一个命令?

文件:

foo
bar
42
foo
bar

我想为date上的每个匹配执行例如foo

以下尝试不起作用:

grep file foo | date %s.%N

怎么做?

6 个答案:

答案 0 :(得分:37)

grep file foo | while read line ; do echo "$line" | date %s.%N ; done

在脚本中更容易阅读:

grep file foo | while read line
do
    echo "$line" | date %s.%N
done

对于每一行输入,read会将值放入变量$linewhile语句将执行do和{{1}之间的循环体}}。由于值现在是变量而不是标准输入,我使用done将其推回到标准输入,但你可以做echo,假设日期是这样的。

避免使用类似的date %s.%N "$line",因为for line in `grep file foo`总是在空格上中断,这会成为读取文件列表的噩梦:

for

会因 find . -iname "*blah*.dat" | while read filename; do .... 而失败。

答案 1 :(得分:11)

您真正需要的是 xargs 命令。 http://en.wikipedia.org/wiki/Xargs

grep file foo | xargs date %s.%N

匹配某些文件并将匹配转换为Cygwin环境中的完整Windows路径的示例

$ find $(pwd) -type f -exec ls -1 {} \; | grep '\(_en\|_es\|_zh\)\.\(path\)$' | xargs cygpath -w

答案 2 :(得分:1)

在Linux中有一个有趣的命令: xargs ,它允许您使用先前命令(grep,ls,find等)的输出作为输入。定制执行,但具有多个选项,您甚至可以并行执行定制命令。下面是一些示例:

根据您的问题,以下是如何为file.txt中的每个“ foo ”匹配项以“ %s。%N ”格式打印日期:< / p>

grep "foo" file.txt | xargs -I {} date +%s.%N

更有趣的用途是为每个匹配项创建一个文件,但是在这种情况下,如果匹配项相同,则该文件将被覆盖:

grep "foo" file.txt | xargs -I {} touch {}

如果要将自定义日期连接到创建的文件

grep "foo" file.txt | xargs -I {} touch "{}`date +%s.%N`"

想象一下,匹配项是文件名,您想对其进行备份:

grep "foo" file.txt | xargs -I {} cp {} "{}.backup"

最后对于xargs,使用backupName中的自定义日期

grep "foo" file.txt | xargs -I {} cp {} "{}`date +%s.%N`"

有关诸如 xargs 的并行执行之类的选项的更多信息,请访问:https://en.wikipedia.org/wiki/Xargs和日期格式:https://www.thegeekstuff.com/2013/05/date-command-examples/

另外,我还发现在这种情况下有用的法线命令更为简单,但通用性较低,下面与上述示例等效:

for i in `grep "foo" test.txt`; do date +%s.%N; done
for i in `grep "foo" test.txt`; do touch ${i}; done
for i in `grep "foo" test.txt`; do touch "${i}`date +%s.%N`"; done
for i in `grep "foo" test.txt`; do cp ${i} "${i}.backup2"; done
for i in `grep "foo" test.txt`; do cp ${i} "${i}.backup2`date +%s.%N`"; done

玩得开心!!!

答案 3 :(得分:0)

grep command_string file | sh - 

答案 4 :(得分:0)

grep可能需要--line-buffered选项才能在匹配每条匹配行时发出它,否则它会在打印匹配行之前缓冲多达4K字节,这在这里无法达到目标,例如

tail -f source | grep --line-buffered "expression | xargs ...

答案 5 :(得分:0)

    grep search_string files_to_search | sh