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必须位于行首,或者以非单字组成字符开头。