grep を使用して単語の出現と別の単語の不在を検索する方法

grep を使用して単語の出現と別の単語の不在を検索する方法

次のような内容のファイルがあります:

google.com,9,AB+CD,nonAB+nonCD
youtube.com,9,AB+CD,AB+CD
facebook.com,20,AB+CD,nonCD

列の数は固定ではありません。ただし、最初の列は URL、2 番目の列は数字、3 番目の列からはカンマで区切られたキーワードになりますが、これらはサイトによって異なります。

行内のキーワードを制御できる URL (行) の数をカウントしたいです。たとえば、
1)およびAB+CDなし。注意: AB+CD という単語は複数回出現することがあります。2) および なしの AB+CD (ただし、他に何かがあっても問題ありません)nonABnonCDnonCD

行内の文字列を検索し、別の文字列が存在しないことを確認する方法。次のように使用します。

grep 'AB+CD' test.txt > result.txt

「AB+CD」が見つかったすべての行を出力します。

'AB+CD' のみが含まれる行を印刷したい場合はどうすればよいでしょうか。

youtube.com,9,AB+CD,AB+CD

または、「AB+CD」と「nonAB」以外のものを組み合わせて次のようになります。

youtube.com,9,AB+CD,AB+CD
facebook.com,20,AB+CD,nonCD

答え1

grep -v列を気にせずにプレーンテキスト検索だけを実行したい場合は、次のように反転一致を連鎖させることができます。

cat input.txt | grep 'IncludedText' | grep -v 'ExcludedText'

列ごとに適切なフィルタリングを行う場合は、 のようなものを使用しますawk

答え2

一般的なトリック:

  1. fooプラスを含む行bar( foo OR bar) を含む行:

    grep -e foo -e bar
    
  2. 同じ行にfooと を含む行( ):barfoo AND bar

    grep foo | grep bar
    
  3. baz( )を含まない行NOT baz:

    grep -v baz
    

これらのブリックを使用してロジックを構築できます。問題は、-v単一のパターンに限定されず、全体にグローバルであることですgrep(少なくとも私の Debian では)。これにより、次のことがNOT (foo OR bar)可能になります。

grep -v -e foo -e bar

これは次と同等です(NOT foo) AND (NOT bar):

grep -v foo | grep -v bar

しかし、NOT (foo AND bar)(論理的には と同等)を得るのはそれほど簡単ではありません。で を(NOT foo) OR (NOT bar)得ようと試みることができます。foo AND barシングル(延長)grep:

  1. 再び、同じ行にfooと を含む行( ):barfoo AND bar

    grep -E 'foo.*bar|bar.*foo'
    

今すぐ入手NOT (foo AND bar):

grep -v -E 'foo.*bar|bar.*foo'

上記が 2 つ以上のパターンを扱う場合の完全なシステムであるかどうかはわかりません。それでも、いくつかの問題はこれで解決できます。例:

AB+CDなしnonABnonCD

私の理解が正しければそれはAB+CD AND NOT (nonAB OR nonCD)

grep AB+CD | grep -v -e nonAB -e nonCD

このリクエストにより事態が複雑になることに注意してください:

「AB+CD」のみの行を印刷したい

大丈夫だと言う人もgrep ,AB+CD,AB+CDいるかもしれませんが、「列の数は固定されていない」ので、次の 2 つの行を区別したいのではないでしょうか。

youtube.com,9,AB+CD,AB+CD,AB+CD
youtube.com,9,AB+CD,AB+CD,banana

このような場合には、より複雑な正規表現や他のツール (などawk) が必要になります。

答え3

ここで答えが得られますが、男のgrep(圧倒されるかもしれない)そしていくつかの例とりあえず、答えはこうです:

使用grep

grep "foobar" test.txt

foobarはファイル内の単語を含む行を検索しtest.txt、すべての出現箇所を表示しますが、

grep "foo" -v "bar" test.txt

fooは単語を含むが含まない行を検索しますbar。これは、-vマニュアルページで説明されているスイッチ:

-v, --invert-match
    Invert the sense of matching, to select non-matching lines.
    (-v is specified by POSIX .)

これは単に、それらの単語(ここ)を含む行を検索するがbar、最終的な表示ではそれらを除外することを意味します。したがって検索を反転する

また、検索に一致する行の数を数えるには、-cスイッチ:

-c, --count
    Suppress normal output; instead print a count of matching lines
    for each input file. With the -v, --invert-match option (see below),
    count non-matching lines. (-c is specified by POSIX .)

練習として、ファイルに対するgrep検索を試してみてください。フーバー

答え

AB+CD無視してnonABURLをカウントする検索nonCD:

grep "AB+CD" test | grep -cve "non"

ここで、とは両方とも含まれているため、-v "non"単に両方を無視します。 は、一致を印刷する代わりに、一致の合計数を表示します。一致する行を印刷するには、 を無視するだけです。nonABnonCDnon-c-c

別々の反転に使用できます。

grep "AB+CD" test | grep -cve "nonAB\|nonCD"

ここで、\|およびは、またはのORいずれかを意味します。nonABnonCD ちょうど指定された単語-eスイッチ。


お勧めしますカミルの回答を見るできるだけ多くのマニュアルページを読み(コマンドは知っています)、オンラインで検索しながら一生懸命努力し、コミュニティに貢献してください。回答には、さらに詳しい情報を自由に追加してください。

関連情報