web-dev-qa-db-ja.com

grepが同じ文字列を複数回印刷するのを防ぐ方法は?

次を含むファイルをgrepした場合:

These are words
These are words
These are words
These are words

... Word Theseの場合、文字列These are wordsを4回出力します。

grepが繰り返し文字列を複数回印刷するのを防ぐにはどうすればよいですか?それ以外の場合、grepの出力を操作して重複行を削除するにはどうすればよいですか?

12
Trae

Unixの哲学は、1つのことを実行し、それらを適切に実行するツールを持つことです。この場合、grepは、ファイルからテキストを選択するツールです。重複があるかどうかを調べるために、テキストをソートします。重複を削除するには、sort-uオプションを使用します。副<文>この[前述の事実の]結果として、それ故に、従って、だから◆【同】consequently; therefore <文>このような方法で、このようにして、こんなふうに、上に述べたように◆【同】in this manner <文>そのような程度まで<文> AひいてはB◆【用法】A and thus B <文>例えば◆【同】for example; as an example:

grep These filename | sort -u

sortには多くのオプションがあります。man sortを参照してください。重複をカウントする場合、または重複の有無を判断するためのより複雑なスキームを使用する場合は、ソート出力をuniqgrep These filename | sort | uniqにパイプして、オプションについてmanuniq`を参照してください。

19
John1024

単一の文字列のみを探している場合は、grepと追加のスイッチを使用します

grep -m1 'These' filename

man grepから

-m NUM, --max-count=NUM
        Stop reading a file after NUM matching lines.  If the input is
        standard input from a regular file, and NUM matching lines are
        output, grep ensures that the standard input is positioned  to
        just  after  the  last matching  line  before exiting, regardless
        of the presence of trailing context lines.  This enables a calling
        process to resume a search.  When grep stops after NUM matching
        lines, it outputs any trailing context lines.  When the -c or
        --count option is also used, grep does not output a count greater
        than NUM.  When the -v or --invert-match option is also used, grep
        stops after outputting NUM non-matching lines.

またはawkを使用して;)

awk '/These/ {print; exit}' foo
1
A.B.