从unix目录中搜索模式

时间:2016-06-30 22:17:50

标签: grep

我想查找一个unix目录中的任何脚本是否正在使用一个特定的表作为"select *"。意味着我想找到"select * from tablename"。现在选择后,可以有任意数量的空格或换行符,如"select <any number of space or newline> * <any number of space or newline> from <any number of space or newline> tablename"

1 个答案:

答案 0 :(得分:0)

我们将其作为测试文件:

$ cat file
 select
    *
  from

  tablename

使用grep:

$ grep -z 'select\s*[*]\s*from\s*tablename' -- file
 select
    *
  from

  tablename

-z告诉将输入视为NUL分隔。由于没有合理的文本文件包含NUL字符,因此可以立即读取整个文件。这允许我们搜索多行。 (如果文件对于内存来说太大,我们会考虑另一种方法。)为了防止以-开头的文件名,--用于告诉grep停止选项处理。

仅获取当前目录中匹配文件的名称:

grep -lz 'select\s*[*]\s*from\s*tablename' -- *

*告诉grep查看目录中的所有文件。 -l告诉grep只打印匹配文件的名称而不是匹配的文本。

更多关于需要 -

让我们考虑一个包含一个文件的目录:

$ ls
-l-

现在,让我们运行一个grep命令:

$ grep 'regex' *
grep: invalid option -- '-'
Usage: grep [OPTION]... PATTERN [FILE]...
Try 'grep --help' for more information.

问题在于grep将文件名解释为两个选项:l-。由于第二个不是合法选项,因此会报告错误。为防止这种情况发生,我们需要使用--。以下将运行且没有错误:

grep 'regex' -- *