grep能否只显示符合搜索模式的单词?

grep能否只显示符合搜索模式的单词?,grep,words,Grep,Words,有没有办法让grep从匹配搜索表达式的文件中输出“单词” 如果我想在多个文件中查找所有实例,例如“th”,我可以执行以下操作: grep "th" * 但输出将类似(我用粗体) 这可以使用grep吗?或者使用其他工具组合?只需awk,无需工具组合 # awk '{for(i=1;i<=NF;i++){if($i~/^th/){print $i}}}' file the the the this thoroughly #awk'{for(i=1;iTrygrep-o: grep -oh

有没有办法让grep从匹配搜索表达式的文件中输出“单词”

如果我想在多个文件中查找所有实例,例如“th”,我可以执行以下操作:

grep "th" *
但输出将类似(我用粗体)


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

只需
awk
,无需工具组合

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

#awk'{for(i=1;iTry
grep-o

grep -oh "\w*th\w*" *
编辑:匹配菲尔的评论

发件人:


您可以通过以下方式将grep输出导入Perl:

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

您可以将空格转换为换行符,然后使用grep,例如:

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

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

发件人:


我对awk难以记忆的语法感到不满意,但我喜欢使用一个实用程序来实现这一点

看起来ack(如果您使用Ubuntu,则为ack grep)可以轻松做到这一点:

# 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命令仅用于匹配和perl

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

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

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

因此,我认为这可能类似于(我不是正则表达式大师):


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

如果您使用的是不包含-o选项的较旧版本的grep(如2.4.2),请使用上面的版本。否则,请使用下面更简单的维护版本

Linux交叉分发安全答案

grep -oh "[[:alpha:]]*th[[:alpha:]]*" 'filename'
总之:
-oh
输出与文件内容匹配的正则表达式(而不是其文件名),就像您希望正则表达式在vim/etc中工作一样。您将搜索什么单词或正则表达式,这取决于您自己!只要您使用POSIX而不是perl语法(请参阅下文)

-o打印每个匹配项,但仅打印匹配项,而不是整行。
-h不得使用输出行打印文件名标题(即文件名)。
-w表达式作为单词搜索(好像被

`[[:要搜索以“icon-”开头的所有单词,下面的命令非常有效。我在这里使用的命令与grep类似,但具有更好的选项和良好的格式

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

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

egrep -wo 'th.[a-z]*' filename.txt #### (Case Sensitive)

egrep -iwo 'th.[a-z]*' 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.
下面是使用
ripgrep
的示例:

rg -o "(\w+)?th(\w+)?"


它将匹配所有匹配
th

但不会给出正确结果的单词。此外,如果使用Perl,则无需使用grep。使用Perl完成所有操作。感谢您指出错误,ghostdog74。我已将其更改为打印行中的所有单词,而不仅仅是第一个。如我所说,grep不是必需的。Perl-n-e'while(/(\s+th\w*)/g){print“$1\n”}文件由您决定。我只是说明一点。如果没有必要,请不要这样做。额外的“|”将使您多花费一个进程。在Perl 5.10或更高版本中:Perl-nE'@a=/(regexp)/ig;说join“\n”,@a'no'need cat.tr''\n'tr
,他可以先执行
grep
,因此
tr
将只应用于匹配的行:
grep th filename | tr'\n'| grep th
,仍将打印整个line包含匹配项。它约束实际匹配项,使
不再匹配,例如“this”或“bathe”@user181548,grep-o选项仅适用于GNU grep。因此,如果您不使用GNU grep,它可能不适用于您。@A-B-B这取决于您是否要显示匹配文件的名称。我不确定在什么情况下它会显示和不会显示,但我知道,当我在多个目录中使用grep时,它确实会显示full file path表示所有匹配的文件,而-h只显示匹配的单词,没有任何关于它是哪个文件的说明。因此,要匹配原始问题,我认为在某些情况下是必要的。我需要解释一下
“\w*th\w*”*
的意思,所以我想我应该发布。
\w
是[\u[:alnum:],因此它基本上匹配任何包含“th”的“word”(因为
\w
不包括空格)。引用部分后面的*是一个glob,其中文件(即匹配此目录中的所有文件)
\w
通常不可移植到
grep-e
;为了正确的移植性,请使用POSIX字符类名
[:alnum:]
相反(或者如果你真的想要下划线,也可以试试
[[uu[:alnum:]]
;或者如果你的平台有下划线,可以试试
grep-P
。@A-B-B如果OP显示了所需的输出,
-h
,我会说……那么-o只在GNU grep中工作怎么办(正如ksinkar在接受答案的评论中提到的那样)“?@Brilliand-hmm,我很难找到一个没有
grep -o -P 'th.*? ' filename
egrep -o "the*|this{1}|thoroughly{1}" filename
grep -h "[[:alpha:]]*th[[:alpha:]]*" 'filename' | tr ' ' '\n' | grep -h "[[:alpha:]]*th[[:alpha:]]*"
grep -oh "[[:alpha:]]*th[[:alpha:]]*" 'filename'
-o      Print each match, but only the match, not the entire line.
-h      Never print filename headers (i.e. filenames) with output lines.
-w      The expression is searched for as a word (as if surrounded by
         `[[:<:]]' and `[[:>:]]';
ack -oh --type=html "\w*icon-\w*" | sort | uniq
egrep -wo 'th.[a-z]*' filename.txt #### (Case Sensitive)

egrep -iwo 'th.[a-z]*' 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.
rg -o "(\w+)?th(\w+)?"