一部のパターンを除いて、grepする方法は?


84

あるパターンが発生し、他のパターンがないファイル内の行を見つけたいのですが。たとえばloomgloom。を含むものを除くすべてのファイル/行を検索する必要があります。だから、私はloomコマンドで見つけることができます:

grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)

さて、をloom除いて検索したいですgloom。ただし、次の両方のコマンドが失敗しました。

grep -v 'gloom' -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)
grep -n 'loom' -v 'gloom' ~/projects/**/trunk/src/**/*.@(h|cpp)

目標を達成するにはどうすればよいですか?

EDIT 1:私はことを意味loomし、gloom文字列(必ずしも言葉)です。したがって、たとえば、bloombergコマンド出力に必要であり、必要ありませんungloomy

編集2:私の期待のサンプルがあります。次の行は両方ともコマンド出力にあります。

お香のベールから浮かび上がるアイコンに直面しました。

アーティは憂鬱な日に迫っています。

次の行は両方ともコマンド出力に含まれていません。

それはだgloomyin cloods - O偉大マックルdoolders owerひどい」を。

ハイピンティットホールの南西ラウンド


基準に一致する行の基準に一致するファイルを探していますか?
樹人2013

条件に一致する行を持つファイルを探しています。そして、すべてのセットのリストファイル名+一致する行の数+一致する行自体を見たいです。
織機2013

行がthere is a loom in the gloom-だった場合、その行を印刷しますか?暗闇の一部として以外に織機が発生する線を探しているだけなのか、それとも織機が線の他の場所に単独で表示されている場合でも、暗闇を含む線を本当に除外したいのかを理解しようとしています。いくつかのサンプル入力と期待される出力を投稿すると役立ちます。
エドモートン2013

だからあなたの質問は本当にHow do I find lines containing the string "loom" where "loom" is not preceded by the letter "g"ですか?あなたがいくつかのサンプル入力と望ましい出力を投稿したなら、それは大いに役立つでしょう。その質問への回答は、以下の回答に含まれています。
エド・モートン

1
@EdMortonは-はい、あなたは右をしている-私が生じる場合、すべての行を必要とするloom先行せずg。(申し訳ありません。昨日コメントを開始しましたが、終了しませんでした。誤ってこのコメントが送信されました。)
2013

回答:


102

grepsをチェーンするだけではどうですか?

grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'

13
ジャストインタイム。完璧に動作します。-vは除外するオプションです。ありがとう
Ravi Krishna P

2
質問から:つまり、たとえば、bloombergコマンド出力に必要であり、必要ありませんungloomy 単一の行に「…」が含まれていて、ブルームバーグが見通しについて暗い場合は、その行を削除しますが、必要です(が含まれている場合bloomberg)。
ジョナサンレフラー2017年

23

連鎖のない別の解決策grep

egrep '(^|[^g])loom' ~/projects/**/trunk/src/**/*.@(h|cpp)

行の最初の文字でない限り、角かっこの間では、がg出現する前の文字を除外します。loomloom


9

少し古いですが、まあ...

@houbysoftの最も賛成票を投じたソリューションは、「loom」が含まれている場合でも、「gloom」が含まれる行を除外するため、機能しません。OPの予想によれば、「織機」が含まれている場合でも、「織機」のある行を含める必要があります。この行は、「Artyは憂鬱な日に急降下しています。」という出力に含める必要がありますが、これは次のような連鎖grepによって除外されます。

grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'

代わりに、Bentoy13のegrep正規表現の例の方がうまく機能します

egrep '(^|[^g])loom' ~/projects/**/trunk/src/**/*.@(h|cpp)

「gloom」があるかどうかに関係なく、「loom」が含まれる行が含まれるためです。一方、暗闇しかない場合は含まれません。これはまさにOPが望んでいる動作です。


8

awkを使用するだけで、複合条件を明確に表現できるという点でgrepよりもはるかに簡単です。

loomgloom:の両方を含む行をスキップする場合

awk '/loom/ && !/gloom/{ print FILENAME, FNR, $0 }' ~/projects/**/trunk/src/**/*.@(h|cpp)

またはそれらを印刷したい場合:

awk '/(^|[^g])loom/{ print FILENAME, FNR, $0 }' ~/projects/**/trunk/src/**/*.@(h|cpp)

そして現実があなたloomがそれ自体で単語として現れる行が欲しいだけなら:

awk '/\<loom\>/{ print FILENAME, FNR, $0 }' ~/projects/**/trunk/src/**/*.@(h|cpp)

3
あなたが含まれている行を取得するためにgrepコマンドを記述します方法を考えるabcとをdefし、ghi任意の順序で。それをと比較してくださいawk '/abc/ && /def/ && /ghi/'。次にawk '/loom/ && !/gloom/'、このページの回答にgrepに相当するものがどのように記述されているかを考えてみてください。
エド・モートン

私はawkにあまり精通していません、どうやらそれ自体でこのコマンドについての本があります。今のところ私はgrepで大丈夫です、多分いつか私はあなたがしたのと同じことを言うでしょう。:)
Juto 2013

2
awkは、テキストファイルを処理するための標準のUNXツール(つまり、すべてのUNIXインストールで使用可能)です。それはそれがするために発明されたものであり、それはそれがとても得意です。UNIXを使用していて、テキストファイルを解析している場合は、ArnoldRobins著のEffectiveAwk Programming、ThirdEditionからawkを学んでください。awkscondition { action }構文に関連して乗り越えるための小さなパラダイムシフトがありますが、Cまたは他のAlgolベースの言語の経験がある人にとっては簡単です。
エド・モートン

ボーナス:次のような出力grep -Hn --colorawk '/loom/ && !/gloom/ { gsub(/loom/, color("1;31") "&" color(0)); print color(35) FILENAME color(36) ":" color(32) FNR color(36) ":" color(0) $0; }; function color(c) { return "\033[" c "m"; }'
もつれ

6

-v は「逆一致」フラグであるため、配管は非常に良い方法です。

grep "loom" ~/projects/**/trunk/src/**/*.@(h|cpp)| grep -v "gloom"


5

/ *あなたはこのようなものを探しているかもしれませんか?

grep -vn "gloom" `grep -l "loom" ~/projects/**/trunk/src/**/*.@(h|cpp)`

BACKQUOTESはコマンドの括弧のように使用されるため、この場合-l有効にすると、BACKQUOTESのコードはファイル名を返し、次に-vnを使用して、ファイル名、行番号、および実際の行を指定します。

UPDATEまたはxargsを使用

grep -l "loom" ~/projects/**/trunk/src/**/*.@(h|cpp) | xargs grep -vn "gloom"

お役に立てば幸いです。* /

私が上に書いたことを無視してください、それはごみです。

grep -n "loom" `grep -l "loom" tt4.txt` | grep -v "gloom"

               #this part gets the filenames with "loom"
#this part gets the lines with "loom"
                                          #this part gets the linenumber,
                                          #filename and actual line

4

grep -Pサポートされている(perl正規表現)を使用できますnegative lookbehind

grep -P '(?<!g)loom\b' ~/projects/**/trunk/src/**/*.@(h|cpp)

\b単語の境界を追加しました。


2
あなたは後ろを振り返る必要はありません、\([^g]\|^\)働きます。そして、これはとの両方loomを持つ行を除外しませんgloom
ケビン

@Kevin:OPは織機のある行を見つけたいと思っていますがnot gloom
anubhava 2013

丁度。ラインに両方がある場合、彼はそれを望んでいませんが、これはとにかくそれに一致します。
ケビン

@Kevin:これは暗闇とは一致しませんが、(OPが望むように)織機と一致します。
anubhava 2013

質問から:つまり、たとえば、bloombergコマンド出力に必要であり、必要ありませんungloomy したがって、単語の境界は逆効果です。
ジョナサンレフラー2017年

3
grep -n 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp) | grep -v 'gloom'

質問から:つまり、たとえば、bloombergコマンド出力に必要であり、必要ありませんungloomy 単一の行に「…」が含まれていて、ブルームバーグが見通しについて暗い場合は、その行を削除しますが、必要です(が含まれている場合bloomberg)。
ジョナサンレフラー2017年

@JonathanLeffler「暗闇のあるものを除いて、織機を含むすべてのファイル/行を見つける必要があります。」
ジミニオン2017年

3

使うだけ!grep -v複数回。

ファイルの内容

[root@server]# cat file
1
2
3
4
5

行または一致を除外します

[root@server]# cat file |grep -v 3
1
2
4
5

行を除外するか、複数に一致させる

[root@server]# cat file |grep -v 3 |grep -v 5
1
2
4

0

質問:「gloom」を除く「loom」を検索してください。
回答:

grep -w 'loom' ~/projects/**/trunk/src/**/*.@(h|cpp)

1
質問から:つまり、たとえば、bloombergコマンド出力に必要であり、必要ありませんungloomy それが-wその難問の解決策ではないと思います。
ジョナサンレフラー2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.