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

Raz*_*zer 36 grep

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

文件:

foo
bar
42
foo
bar
Run Code Online (Sandbox Code Playgroud)

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

以下尝试不起作用:

grep file foo | date %s.%N
Run Code Online (Sandbox Code Playgroud)

怎么做?

Phi*_*l H 38

grep file foo | while read line ; do echo "$line" | date %s.%N ; done
Run Code Online (Sandbox Code Playgroud)

在脚本中更容易阅读:

grep file foo | while read line
do
    echo "$line" | date %s.%N
done
Run Code Online (Sandbox Code Playgroud)

对于每一行输入,read将值放入变量中$line,while语句将在do和之间执行循环体done.既然值现在是变量而不是stdin,我已经习惯echo将它推回到stdin,但你可以这样做date %s.%N "$line",假设日期是这样的.

避免使用for line in `grep file foo`类似的,因为for总是在空格上打破,这成为阅读文件列表的噩梦:

 find . -iname "*blah*.dat" | while read filename; do ....
Run Code Online (Sandbox Code Playgroud)

会失败的for.


Mar*_*vec 14

你真正需要的是一个xargs命令.http://en.wikipedia.org/wiki/Xargs

grep file foo | xargs date %s.%N
Run Code Online (Sandbox Code Playgroud)

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

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


小智 7

grep command_string file | sh - 
Run Code Online (Sandbox Code Playgroud)


Enr*_*cio 5

Linux 中有一个有趣的命令:xargs它允许您使用上一个命令(grep、ls、find 等)的输出作为自定义执行的输入,但有几个选项允许您甚至执行自定义并行命令。下面是一些例子:

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

grep "foo" file.txt | xargs -I {} date +%s.%N
Run Code Online (Sandbox Code Playgroud)

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

grep "foo" file.txt | xargs -I {} touch {}
Run Code Online (Sandbox Code Playgroud)

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

grep "foo" file.txt | xargs -I {} touch "{}`date +%s.%N`"
Run Code Online (Sandbox Code Playgroud)

假设匹配的是文件名,并且您想要对它们进行备份:

grep "foo" file.txt | xargs -I {} cp {} "{}.backup"
Run Code Online (Sandbox Code Playgroud)

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

grep "foo" file.txt | xargs -I {} cp {} "{}`date +%s.%N`"
Run Code Online (Sandbox Code Playgroud)

有关并行执行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
Run Code Online (Sandbox Code Playgroud)

玩得开心!!!