grep多个string在文件中不同的行(即整个文件,而不是基于行的search)?

我想grep文件中包含单词DanskSvenskaNorsk在任何一行,有一个可用的返回码(因为我真的只想有信息的string被包含,我的单线进一步,然后这一点)。

我有很多像这样的行中的文件:

 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, (...) 

这是我想要的伪代码:

 for all files in directory; if file contains "Dansk" AND "Norsk" AND "Svenska" then then echo the filename end 

做这个的最好方式是什么? 可以在一条线上完成吗?

您可以使用:

 grep -l Dansk * | xargs grep -l Norsk | xargs grep -l Svenska 

如果你还想在隐藏文件中find:

 grep -l Dansk .* | xargs grep -l Norsk | xargs grep -l Svenska 

还有另一种使用bash和grep的方法:

对于单个文件“test.txt”:

   grep -q Dansk test.txt && grep -q Norsk test.txt && grep -l Svenska test.txt

如果文件包含全部三个(以任意组合),将打印test.txt 。 前两个greps不打印任何东西( -q ),最后一个只打印该文件,如果其他两个已经通过。

如果您想为目录中的每个文件执行此操作:

   为f in *;  grep -q Dansk $ f && grep -q Norsk $ f && grep -l Svenska $ f;  DONE

如何grep在不同的行文件中的多个string(使用pipe道符号):

 for file in *;do test $(grep -E 'Dansk|Norsk|Svenska' $file | wc -l) -ge 3 && echo $file done 

笔记:

  1. 如果你在你的grep中使用双引号"" ,你将不得不像这样跳过pipe道: \| searchDansk,Norsk和Svenska。

  2. 假设一行只有一种语言。

演练: http : //www.cyberciti.biz/faq/howto-use-grep-command-in-linux-unix/

你可以很容易地做到这一点:

 ack -l 'cats' | ack -xl 'dogs' 
  • -l :返回文件列表
  • -x :从STDIN(之前的search)中获取文件并仅search这些文件

你可以保持pipe道,直到你得到你想要的文件。

 awk '/Dansk/{a=1}/Norsk/{b=1}/Svenska/{c=1}END{ if (a && b && c) print "0" }' 

那么你可以用shell来捕获返回值

如果你有Ruby(1.9+)

 ruby -0777 -ne 'print if /Dansk/ and /Norsk/ and /Svenka/' file 

只是:

 grep 'word1\|word2\|word3' * 

看到这个职位的更多信息

 grep –irl word1 * | grep –il word2 `cat -` | grep –il word3 `cat -` 
  • -i使search不区分大小写
  • -r通过文件夹使文件searchrecursion
  • -l用find的单词pipe理文件列表
  • cat -导致下一个grep查看传递给它的文件列表。

这是glenn jackman和kurumi的答案的混合,允许任意数量的正则expression式,而不是任意数量的固定词或固定的正则expression式。

 #!/usr/bin/awk -f # by Dennis Williamson - 2011-01-25 BEGIN { for (i=ARGC-2; i>=1; i--) { patterns[ARGV[i]] = 0; delete ARGV[i]; } } { for (p in patterns) if ($0 ~ p) matches[p] = 1 # print # the matching line could be printed } END { for (p in patterns) { if (matches[p] != 1) exit 1 } } 

像这样运行它:

 ./multigrep.awk Dansk Norsk Svenska 'Language: .. - A.*c' dvdfile.dat 

扩展@ kurumi的awk答案,这是一个bash函数:

 all_word_search() { gawk ' BEGIN { for (i=ARGC-2; i>=1; i--) { search_terms[ARGV[i]] = 0; ARGV[i] = ARGV[i+1]; delete ARGV[i+1]; } } { for (i=1;i<=NF; i++) if ($i in search_terms) search_terms[$1] = 1 } END { for (word in search_terms) if (search_terms[word] == 0) exit 1 } ' "$@" return $? } 

用法:

 if all_word_search Dansk Norsk Svenska filename; then echo "all words found" else echo "not all words found" fi 

以下是对我有用的方法:

 find . -path '*/.svn' -prune -o -type f -exec gawk '/Dansk/{a=1}/Norsk/{b=1}/Svenska/{c=1}END{ if (a && b && c) print FILENAME }' {} \; ./path/to/file1.sh ./another/path/to/file2.txt ./blah/foo.php 

如果我只是想用这三个find.sh文件,那么我可以使用:

 find . -path '*/.svn' -prune -o -type f -name "*.sh" -exec gawk '/Dansk/{a=1}/Norsk/{b=1}/Svenska/{c=1}END{ if (a && b && c) print FILENAME }' {} \; ./path/to/file1.sh 

我用两个步骤做了。 在一个文件中列出csv文件在本页面的帮助下,我做了两个无脚本的步骤来获得我所需要的。 只需inputterminal:

 $ find /csv/file/dir -name '*.csv' > csv_list.txt $ grep -q Svenska `cat csv_list.txt` && grep -q Norsk `cat csv_list.txt` && grep -l Dansk `cat csv_list.txt` 

它正是我所需要的 – 打印包含所有三个单词的文件名。

还要介意像`' "

这在多个文件中search多个单词:

 egrep 'abc|xyz' file1 file2 ..filen 

如果您只需要两个search条件,则可以说最可读的方法是运行每个search并交叉结果:

  comm -12 <(grep -rl word1 . | sort) <(grep -rl word2 . | sort) 

我今天遇到了这个问题,这里的所有单线都没有给我,因为这些文件中包含了空格。

这是我想到的工作:

 grep -ril <WORD1> | sed 's/.*/"&"/' | xargs grep -il <WORD2>