次のような内容のファイルがあります:
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 (ただし、他に何かがあっても問題ありません)nonAB
nonCD
nonCD
行内の文字列を検索し、別の文字列が存在しないことを確認する方法。次のように使用します。
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
一般的なトリック:
foo
プラスを含む行bar
(foo OR bar
) を含む行:grep -e foo -e bar
同じ行に
foo
と を含む行( ):bar
foo AND bar
grep foo | grep bar
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
:
再び、同じ行に
foo
と を含む行( ):bar
foo AND bar
grep -E 'foo.*bar|bar.*foo'
今すぐ入手NOT (foo AND bar)
:
grep -v -E 'foo.*bar|bar.*foo'
上記が 2 つ以上のパターンを扱う場合の完全なシステムであるかどうかはわかりません。それでも、いくつかの問題はこれで解決できます。例:
AB+CD
なしnonAB
とnonCD
私の理解が正しければそれは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
無視してnonAB
URLをカウントする検索nonCD
:
grep "AB+CD" test | grep -cve "non"
ここで、とは両方とも含まれているため、-v "non"
単に両方を無視します。 は、一致を印刷する代わりに、一致の合計数を表示します。一致する行を印刷するには、 を無視するだけです。nonAB
nonCD
non
-c
-c
別々の反転に使用できます。
grep "AB+CD" test | grep -cve "nonAB\|nonCD"
ここで、\|
およびは、またはのOR
いずれかを意味します。nonAB
nonCD
ちょうど指定された単語-e
スイッチ。
お勧めしますカミルの回答を見るできるだけ多くのマニュアルページを読み(コマンドは知っています)、オンラインで検索しながら一生懸命努力し、コミュニティに貢献してください。回答には、さらに詳しい情報を自由に追加してください。