我想grep包含单词的文件Dansk
,Svenska
或者 Norsk
在任何一行上使用可用的返回码(因为我真的只想知道包含字符串的信息,我的单行程稍微进一步了).
我有很多带有行的文件,如下所示:
Disc Title: unknown
Title: 01, Length: 01:33:37.000 Chapters: 33, Cells: 31, Audio streams: 04, Subpictures: 20
Subtitle: 01, Language: ar - Arabic, Content: Undefined, Stream id: 0x20,
Subtitle: 02, Language: bg - Bulgarian, Content: Undefined, Stream id: 0x21,
Subtitle: 03, Language: cs - Czech, Content: Undefined, Stream id: 0x22,
Subtitle: 04, Language: da - Dansk, Content: Undefined, Stream id: 0x23,
Subtitle: 05, Language: de - Deutsch, Content: Undefined, Stream id: 0x24,
(...)
Run Code Online (Sandbox Code Playgroud)
这是我想要的伪代码:
for all files in directory;
if file contains "Dansk" AND "Norsk" AND "Svenska" then
then echo the filename
end
Run Code Online (Sandbox Code Playgroud)
做这个的最好方式是什么?可以在一条线上完成吗?
vmp*_*str 85
您可以使用:
grep -l Dansk * | xargs grep -l Norsk | xargs grep -l Svenska
Run Code Online (Sandbox Code Playgroud)
如果您还想在隐藏文件中找到:
grep -l Dansk .* | xargs grep -l Norsk | xargs grep -l Svenska
Run Code Online (Sandbox Code Playgroud)
Edd*_*eel 21
另一种方法是使用bash和grep:
对于单个文件'test.txt':
grep -q Dansk test.txt && grep -q Norsk test.txt && grep -l Svenska test.txt
test.txt
如果文件包含全部三个(以任意组合),将打印.前两个greps不打印任何东西(-q
),最后一个只打印文件,如果其他两个已通过.
如果要对目录中的每个文件执行此操作:
for f in *; do grep -q Dansk $f && grep -q Norsk $f && grep -l Svenska $f; done
小智 15
grep –irl word1 * | grep –il word2 `cat -` | grep –il word3 `cat -`
Run Code Online (Sandbox Code Playgroud)
-i
使搜索案例不敏感-r
通过文件夹递归文件搜索-l
使用找到的单词管理文件列表cat -
导致下一个grep查看传递给它的文件列表.Dam*_*n R 10
如何在不同行的文件中grep多个字符串(使用管道符号):
for file in *;do
test $(grep -E 'Dansk|Norsk|Svenska' $file | wc -l) -ge 3 && echo $file
done
Run Code Online (Sandbox Code Playgroud)
笔记:
如果你""
在grep中使用双引号,你将不得不像这样逃避管道:\|
搜索Dansk,Norsk和Svenska.
假设一行只有一种语言.
演练:http://www.cyberciti.biz/faq/howto-use-grep-command-in-linux-unix/
小智 6
这会搜索多个文件中的多个单词:
egrep 'abc|xyz' file1 file2 ..filen
Run Code Online (Sandbox Code Playgroud)
awk '/Dansk/{a=1}/Norsk/{b=1}/Svenska/{c=1}END{ if (a && b && c) print "0" }'
Run Code Online (Sandbox Code Playgroud)
然后你可以用 shell 捕获返回值
如果你有 Ruby(1.9+)
ruby -0777 -ne 'print if /Dansk/ and /Norsk/ and /Svenka/' file
Run Code Online (Sandbox Code Playgroud)
您可以使用ack轻松完成此操作:
ack -l 'cats' | ack -xl 'dogs'
Run Code Online (Sandbox Code Playgroud)
-l
:返回文件列表 -x
:从STDIN(上一次搜索)中获取文件,仅搜索这些文件你可以保持管道直到你得到你想要的文件.