是否有一种方法使grep从匹配搜索表达式的文件中输出“单词”?

如果我想在一些文件中找到“th”的所有实例,我可以这样做:

grep "th" *

但是输出会是这样的(粗体是我的);

some-text-file : the cat sat on the mat  
some-other-text-file : the quick brown fox  
yet-another-text-file : i hope this explains it thoroughly 

我想让它输出什么,使用相同的搜索,是:

the
the
the
this
thoroughly

这可能使用grep吗?或者使用另一种工具组合?


当前回答

我对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标志来完成更复杂的搜索,使用我发现的最简单的语法:

# 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

其他回答

$ grep -w

摘自grep手册页:

-w:只选择包含完整单词的匹配行。测试是匹配的子字符串必须在行首,或者前面有一个非单词组成字符。

我对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标志来完成更复杂的搜索,使用我发现的最简单的语法:

# 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

只需awk,不需要组合工具。

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

我有一个类似的问题,寻找grep/pattern regex和“匹配的模式找到”作为输出。

最后,我使用了选项-o的egrep(相同的正则表达式在grep -e或-G上没有给我相同的egrep结果)

所以,我认为这可能是类似于(我不是一个正则表达式大师):

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

Grep命令只与perl匹配

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