grep只能显示匹配search模式的文字吗?

有没有办法让grep输出符合searchexpression式的文件的“单词”?

如果我想在许多文件中find所有“th”的实例,我可以这样做:

grep "th" * 

但是输出结果会像(大胆的是我);

一些文本文件:猫坐在垫子上  
一些其他的文本文件:快速的棕色狐狸  
另一个文本文件:我希望这个解释彻底 

我想要它输出,使用相同的search,是:

 the the the this thoroughly 

这可能使用grep? 或者使用其他工具组合?

尝试grep -o

 grep -oh "\w*th\w*" * 

编辑:从菲尔的评论匹配

从文档 :

 -h, --no-filename Suppress the prefixing of file names on output. This is the default when there is only one file (or only standard input) to search. -o, --only-matching Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line. 

交叉分配安全答案(包括windows minGW?)

 grep -h "[[:alpha:]]*th[[:alpha:]]*" 'filename' | tr ' ' '\n' | grep -h "[[:alpha:]]*th[[:alpha:]]*" 

如果你使用旧版本的grep(比如2.4.2),那里面不包括-o选项。 使用上面的。 否则使用更简单的维护版本。

Linux交叉分配安全答案

 grep -oh "[[:alpha:]]*th[[:alpha:]]*" 'filename' 

总结-oh输出正则expression式匹配到文件内容(而不是它的文件名),就像你期望正则expression式在vim / etc中工作一样…然后,你将要search什么词或正则expression式是由你决定! 只要您保持POSIX而不是perl语法(请参阅下文)

更多来自grep的手册

 -o Print each match, but only the match, not the entire line. -h Never print filename headers (ie filenames) with output lines. -w The expression is searched for as a word (as if surrounded by `[[:<:]]' and `[[:>:]]'; 

原来的答案之所以不适合每个人

\w的用法因平台而异,因为它是扩展的“perl”语法。 因此,那些仅限于使用POSIX字符类的grep安装使用[[:alpha:]]而不是其相当于\w perl。 有关更多信息,请参阅正则expression式的Wikipedia页面

最终,上面的POSIX答案将会更加可靠,而不pipegrep的平台(是原始的)

至于支持没有-o选项的grep,第一个grep输出相关的行,tr将空格分割成新的行,最后的grep只对相应的行进行过滤。

(PS:我现在知道大多数平台,本来会补贴的……但是总是有那些落后的)

从@AdamRosenfield回答信用“-o”解决方法

你可以把空格翻译成换行符,然后grep,例如:

 cat * | tr ' ' '\n' | grep th 

awk ,不需要工具的组合。

 # awk '{for(i=1;i<=NF;i++){if($i~/^th/){print $i}}}' file the the the this thoroughly 

grep命令仅用于匹配和perl

 grep -o -P 'th.*? ' filename 

我不满意awk难以记住的语法,但我喜欢使用一个实用程序来做到这一点。

这似乎是ack(或者ack-grep,如果你使用Ubuntu的话)可以很容易地做到这一点:

 # ack-grep -ho "\bth.*?\b" * the the the this thoroughly 

如果你省略-h标志,你会得到:

 # ack-grep -o "\bth.*?\b" * some-other-text-file 1:the some-text-file 1:the the yet-another-text-file 1:this thoroughly 

作为奖励,您可以使用--output标志来执行更复杂的search,只需find最简单的语法即可:

 # echo "bug: 1, id: 5, time: 12/27/2010" > test-file # ack-grep -ho "bug: (\d*), id: (\d*), time: (.*)" --output '$1, $2, $3' test-file 1, 5, 12/27/2010 
 cat *-text-file | grep -Eio "th[az]+" 

以“icon-”开始search所有的单词,下面的命令完美的工作。 我在这里使用的Ack类似于grep,但有更好的选项和漂亮的格式。

 ack -oh --type=html "\w*icon-\w*" | sort | uniq 

这比你想象的更简单。 尝试这个:

 egrep -wo 'th.[az]*' filename.txt #### (Case Sensitive) egrep -iwo 'th.[az]*' filename.txt ### (Case Insensitive) 

哪里,

  egrep: Grep will work with extended regular expression. w : Matches only word/words instead of substring. o : Display only matched pattern instead of whole line. i : If u want to ignore case sensitivity. 

你也可以试试pcregrep 。 在grep中也有一个-w选项,但在某些情况下它不能按预期工作。

维基百科 :

 cat fruitlist.txt apple apples pineapple apple- apple-fruit fruit-apple grep -w apple fruitlist.txt apple apple- apple-fruit fruit-apple 

我有一个类似的问题,寻找grep /模式正则expression式和“匹配模式find”作为输出。

最后,我用egrep(在grep -e或者-G上没有给出和egrep相同的结果),使用-o选项

所以,我认为这可能是类似的东西(我不是一个正则expression大师):

 egrep -o "the*|this{1}|thoroughly{1}" filename 

你可以像这样把你的grep输出转换成Perl:

 grep "th" * | perl -n -e'while(/(\w*th\w*)/g) {print "$1\n"}' 
 $ grep -w 

摘自grep手册页:

-w:只select包含构成整个单词的匹配的那些行。 testing是匹配子string必须位于行首,或者以非单字组成字符开头。