从bash脚本调用grep

时间:2009-10-02 20:53:51

标签: bash grep

我是bash脚本(以及* nix shell)的新手,但我正在尝试编写这个脚本,以便更轻松地使用代码库。

我写过这个

#!/bin/bash
args=("$@");
for arg in args
 grep arg * */* */*/* */*/*/* */*/*/*/*;
done

当我尝试运行它时,会发生这种情况:

~/Work/richmond $ ./f.sh "\$_REQUEST\['a'\]"
./f.sh: line 4: syntax error near unexpected token `grep'
./f.sh: line 4: `       grep arg * */* */*/* */*/*/* */*/*/*/*;'
~/Work/richmond $

我该如何正确地做到这一点?

而且,我认为一个更重要的问题是,如何让grep像这样通过子目录进行递归呢?

使用shell脚本和使用bash的任何其他提示和/或陷阱也将受到赞赏。

6 个答案:

答案 0 :(得分:9)

语法错误是因为您遗漏了do。至于如果您的grep具有-R选项,则递归搜索:

#!/bin/bash
for arg in "$@"; do
   grep -R "$arg" *
done

否则您可以使用find

#!/bin/bash
for arg in "$@"; do
   find . -exec grep "$arg" {} +
done

在后一个示例中,find将执行grep并将{}大括号替换为它找到的文件名,从当前目录.开始。

(请注意,我还将arg更改为"$arg"。您需要使用美元符号来获取变量的值,并且引号会告诉shell将其值视为一个大词,即使{ {1}}包含空格或换行符。)

答案 1 :(得分:3)

关于递归grepping:

根据您的grep版本,您可以将-R传递给grep命令,让它以递归方式搜索(在子目录中)。

答案 2 :(得分:1)

上面列出了最佳解决方案,但请尝试将您的陈述放在后面:

`grep ...`

答案 3 :(得分:1)

你应该使用'find'加'xargs'来进行文件搜索。

for arg in "$@"
do
    find . -type f -print0 | xargs -0 grep "$arg" /dev/null
done

-print0”和“-0”选项假设您正在使用GNU grep,并确保即使路径名中有空格或其他意外字符,脚本也能正常运行。像这样使用xargsfind为每个文件执行它更有效; /dev/null出现在参数列表中,因此grep始终报告包含匹配项的文件的名称。

您可以决定简化生活 - 也许 - 将所有搜索结合使用egrepgrep -E。优化是从find捕获一次输出,然后在每次迭代时将其输入xargs

答案 4 :(得分:0)

查看findrepo脚本,它可能会给你一些指示

答案 5 :(得分:0)

如果你只想要一个更好的grep并且不想自己做任何事情,请使用ack,你可以在http://betterthangrep.com/获得。