842

検索式に一致するファイルからgrep出力「単語」を作成する方法はありますか?

多数のファイルで、たとえば「th」のすべてのインスタンスを見つけたい場合は、次のようにします。

grep "th" *

しかし、出力は次のようになります (太字は私によるものです);

some-text-file :猫マット  の上座っていた
some-other-text-file :素早い茶色の  キツネ
yet-another-text-file :これで完全に説明できることを願っています 

同じ検索を使用して出力したいものは次のとおりです。

the
the
the
this
thoroughly

これはgrepを使用して可能ですか?それとも別のツールの組み合わせを使用していますか?

4

14 に答える 14

1201

試してください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.
于 2009-10-10T01:01:36.047 に答える
49

スペースを改行に変換してから grep することができます。

cat * | tr ' ' '\n' | grep th
于 2009-10-10T01:43:06.337 に答える
44

ただawk、ツールの組み合わせは必要ありません。

# awk '{for(i=1;i<=NF;i++){if($i~/^th/){print $i}}}' file
the
the
the
this
thoroughly
于 2009-10-10T00:54:12.160 に答える
12

マッチングと perl のみの grep コマンド

grep -o -P 'th.*? ' filename
于 2012-11-29T09:11:26.607 に答える
10

私は awk の覚えにくい構文に満足していませんでしたが、1 つのユーティリティを使用してこれを行うというアイデアは気に入りました。

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
于 2011-01-11T21:25:48.313 に答える
9
cat *-text-file | grep -Eio "th[a-z]+"
于 2010-09-14T15:30:51.730 に答える
4

「icon-」で始まるすべての単語を検索するには、次のコマンドが最適です。ここではAckを使用しています。これは grep に似ていますが、より優れたオプションと優れた書式設定を備えています。

ack -oh --type=html "\w*icon-\w*" | sort | uniq
于 2014-01-16T15:46:55.197 に答える
4

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
于 2009-11-14T12:15:02.517 に答える
3

同様の問題があり、grep/pattern 正規表現と「一致したパターンが見つかりました」を出力として探しました。

最後に、オプション -o を指定して egrep を使用しました (grep -e または -G で同じ正規表現を使用しても、egrep と同じ結果が得られませんでした)。

だから、それは(私は正規表現マスターではありません)に似ていると思います:

egrep -o "the*|this{1}|thoroughly{1}" filename
于 2013-02-14T16:39:19.213 に答える
-1

次のように、grep 出力を Perl にパイプできます。

grep "th" * | perl -n -e'while(/(\w*th\w*)/g) {print "$1\n"}'
于 2009-10-10T01:06:09.370 に答える
-2
$ grep -w

grep man ページからの抜粋:

-w:単語全体を形成する一致を含む行のみを選択します。テストは、一致する部分文字列が行の先頭にあるか、単語以外の構成文字が前にある必要があることです。

于 2012-05-29T06:32:31.807 に答える