Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix';查找'+';grep';语法与awk_Unix_Syntax_Find_Grep - Fatal编程技术网

Unix';查找'+';grep';语法与awk

Unix';查找'+';grep';语法与awk,unix,syntax,find,grep,Unix,Syntax,Find,Grep,我用这行代码在我所在的目录及其所有子目录的文件中找到短语“B206” find . -exec grep -s "B206" '{}' \; -print 当它试图读取某些文件并将putty中的标题栏更改为一堆奇怪的字符时,它会崩溃 例如,当它碰到子目录中的jpg文件时,它总是崩溃。标题栏更改,屏幕中存在: ÐF»*rkNQeË+Z׳kU£~MÞçÄZ½ªéúýØâÑn¡[U+Þ4ªÒ9/ê£<ú¯4}[IÓ­îÃ¥K»G%ݳ¢ F>rkNQe+Z×3 kU~MÞÄZ½ýØn[U

我用这行代码在我所在的目录及其所有子目录的文件中找到短语“B206”

find . -exec grep -s "B206" '{}' \; -print 
当它试图读取某些文件并将putty中的标题栏更改为一堆奇怪的字符时,它会崩溃

例如,当它碰到子目录中的jpg文件时,它总是崩溃。标题栏更改,屏幕中存在:

ÐF»*rkNQeË+Z׳kU£~MÞçÄZ½ªéúýØâÑn¡[U+Þ4ªÒ9/ê£<ú¯4}[IÓ­îÃ¥K»G%ݳ¢
F>rkNQe+Z×3 kU~MÞÄZ½ýØn[U+4Ò9/n]
find.-type f-a-not-name\*.jpg-exec grep-li“string”{};
此示例来自Mac OSX 10.5,您需要检查您的环境的查找手册页,因为GNU find和其他供应商的实现之间存在一些差异。检查Solaris(只是为了好玩,从未指定目标操作系统):

find.-type f-a!-name\*.jpg-exec grep-li“string”{}; 此构造查找名称不以.jpg结尾的所有文件,并为每个文件查找execs grep


根据您的shell,您可能需要避开砰的一声(!)才能使其如广告所示工作。

您可以使用grep的
-I
开关:

Process  a  binary  file as if it did not contain matching data;
this is equivalent to the --binary-files=without-match option.

简而言之,grep将简单地假设文件不匹配,这将阻止二进制数据被输出。

如果您有权访问gfind,只需在表达式中添加“-not-name'*.jpg'”

gfind . -not -name '*.jpg' -exec grep -s "B206" '{}' \; -print
另一个选项(此任务不需要,但这是一个有用的技巧)是,如果您想使用真正奇特的regexp

查找
一些简单的高级过滤器表达式
-ls | perl-pe'{/您选择的perl(RegExp)/}>。/要搜索的文件

grep选项'cat./files\u to\u search\u in'

#前一行应该有反勾号,但我无法让格式化程序转义它们


这提供了缓存文件列表有时需要的好处,以防您想要更改grep表达式以优化它,或只是执行多个grep。

我尝试了Erik的命令,但遇到了一个关于no-grep谓词的错误。也许我的find版本太旧了

这对我很有用:

find . -type f -a -not -name \*.jpg -exec grep "B206" {} \;

没有理由使用
find
grep
附带一个递归选项,
-r
。只需获取一个包含匹配项的文件名列表(而不是所有文件中所有匹配行的列表),可以使用
-l
选项。如果要完全忽略所有二进制文件,可以使用
--binary files=without match
选项。如果只想忽略具有特定扩展名的文件,可以使用
--exclude
选项,例如
--exclude=*.{jpg,jpeg}
忽略以
.jpg
.jpeg
结尾的所有文件。因此,您应该能够通过此选项获得所需的内容:

grep -r -l --binary-files=without-match .
现在,您在一条评论中提到,您的
grep
版本没有
-r
-l
选项。这很不幸,我建议您使用更新版本的
grep
(最好是GNU版本)

另一个注意事项:如果使用
find-exec
,则应使用
+
来结束命令,而不是使用分号,例如:

find . -exec grep options '{}' '+'
通过使用
+
find
只会派生出一个进程,并将所有匹配的文件名作为命令行参数传递给
grep
的一个实例。只要没有一百万个匹配的文件(这将创建一个远远超出shell处理能力的命令行),这会快得多。如果改用分号,
find
会为每个匹配的文件派生一个新的过程,这对于大量文件来说非常缓慢

grep -r --exclude=*.jpg B206 .
对不起,另一条评论:

只有GNU grep带有-r(递归),真正的UNIX grep没有。您必须安装GNU grep或将其与find.-Terminus一起使用


要将grep与find一起使用,我的语法是:

find . -name "*" -print | xargs grep B206

过滤文件的所有选项,二进制和All,然后将结果作为参数传递给grep命令。

我认为问题在于,当你对二进制文件进行grep时,它会输出二进制数据。二进制数据会以某种方式在你的shell中被解释


我建议尝试使用命令“strings”,确保您的输出仅为文本,然后对“strings”的输出进行grep。只需一个引号,您不需要关闭终端,您可以使用命令“reset”
恢复终端输出模式

您还可以执行以前的grep来删除不需要的扩展:

find -print | grep -v '\(\.jpg\|\.bmp\)$' | xargs grep "B206"

如果您的环境无法执行任何高级grep,那么您的awk也可以:

find . | awk '!/((\.jpeg)|(\.jpg)|(\.png))$/ {print $0;}' | xargs grep "B206"

考虑到最近的情人节结束了,我很惊讶没有人提到它


您可以通过扩展名配置类型,以便“grep”您想要的文件。或者您可以使用--nobinary,因为您一直面临的问题。

我的版本不知道-not是什么。我得到了错误选项msgf首先,您的名字很好…其次-您能给我一个语法示例吗?如果他的grep不支持ort'-not',GNU grep似乎不太可能可用,-I是grep的GNU添加项。我必须有一个旧的/shitty版本的Unix…我从这个命令中得到了这些错误…grep:invallel选项--I grep:invallel选项--rOnly GNU grep附带-r(递归),真正的UNIX grep没有。您必须安装GNU grep或将其与find一起使用。-ls也不理解-这是您正在使用的操作系统/版本?不确定…您的第二个命令似乎正在工作…是否有任何方法修改它以排除所有显示“grep:cannot open…”和/或“find:cannot open…”的行?只有GNU grep带有-r(递归),真正的UNIX grep不会。您必须安装GNU grep或将其与find一起使用。您的环境是什么?bash?tcsh?linux发行版?os x?如果您的系统符合POSIX,您可以用
-而不是
替换
,如果您要查找的字符串始终是surro
find -print | grep -v '\(\.jpg\|\.bmp\)$' | xargs grep "B206"
find . | awk '!/((\.jpeg)|(\.jpg)|(\.png))$/ {print $0;}' | xargs grep "B206"