Unix';查找'+';grep';语法与awk
我用这行代码在我所在的目录及其所有子目录的文件中找到短语“B206”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
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"