Can grep show only words that match search pattern?
Is there a way to make grep output "words" from files that match the search expression?
If I want to find all the instances of, say, "th" in a number of files, I can do:
grep "th" *
but the output will be something like (bold is by me);
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
What I want it to output, using the same search, is:
the
the
the
this
thoroughly
Is this possible using grep? Or using another combination of tools?
Try grep -o
grep -oh "w*thw*" *
Edit: matching from Phil's comment
From the docs:
-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.
Cross distribution safe answer (including windows minGW?)
grep -h "[[:alpha:]]*th[[:alpha:]]*" 'filename' | tr ' ' 'n' | grep -h "[[:alpha:]]*th[[:alpha:]]*"
If your using older versions of grep (like 2.4.2) which does not include the -o option. Use the above. Else use the simpler to maintain version below.
Linux cross distribution safe answer
grep -oh "[[:alpha:]]*th[[:alpha:]]*" 'filename'
To summaries -oh
outputs the regular expression matches to the file content (and not its filename), just like how you would expect regular expression to work in vim/etc... What word or regular expression you would be searching for then, is up to you! As long as you remain to POSIX and not perl syntax (refer below)
More from the manual for grep
-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 `[[:>:]]';
The reason why the original answer does not work for everyone
The usage of w
varies from platform to platform, as its an extended "perl" syntax. As such, those grep installation that is limited to work with POSIX character classes uses [[:alpha:]]
and not its perl equivalent of w
. See the Wikipedia page on regular expression for more
Ultimately, the POSIX answer above will be alot more reliable regardless of platform (being the original) for grep
As for support of grep without -o option, the first grep outputs the relevant lines, the tr splits the spaces to new lines, the final grep filters only for the respective lines.
(PS: I know most platforms by now, would have been patched for w.... but there are always those that lag behind)
Credit for the "-o" workaround from @AdamRosenfield answer
您可以将空格转换为换行符,然后grep,例如:
cat * | tr ' ' 'n' | grep th
链接地址: http://www.djcxy.com/p/13716.html
下一篇: grep只能显示匹配搜索模式的文字吗?