我想查找一个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"
答案 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' -- *