行全体が一致する場合にのみgrepを一致させる方法は?


102

私はこれらを持っています:

$ cat a.tmp
ABB.log
ABB.log.122
ABB.log.123

ABB.logの完全一致を見つけたいと思っていました。

しかし、私がしたとき

$ grep -w ABB.log a.tmp
ABB.log
ABB.log.122
ABB.log.123

それらのすべてが表示されます。

grepを使用して必要なものを入手できますか?

回答:


105

単に正規表現アンカーを指定します。

grep '^ABB\.log$' a.tmp

2
両方のアンカー(^および$)が必要です。
user562374 2011年

2
良いですね!そして、ファイルからのマッチングに正規表現を使用している場合はどうなりますか?"grep -fパターンa.tmp" ??
green69 2013

@ green69数年後、パターンをgrepに渡す前にsedを使用してアンカーを追加できます:sed -r "s/^(.*)$/^\1$/" patterns.txt | egrep -f - a.tmp
Randoms

154
grep -Fx ABB.log a.tmp

grepのmanページから:

-F、--fixed-strings
PATTERNを固定文字列(のリスト)として解釈します
-x、--line-regexp
行全体と完全に一致する一致のみを選択します。


2
残念ながら-Fを使用できませんでした。
ジョニー

@Johnyyいいえ-F?あなたはSolarisを使っていますか?使用する場合/usr/xpg4/bin/grep
Scrutinizer 2013年

9
私はgrepbashスクリプト内を使用しており、このオプションは、受け入れられた回答で提案されている正規表現を使用するよりも優れています。検索している変数内に特殊文字(のように.)があり、コマンドを使用するときにエスケープする必要がないためです。
Gustavo Straube、2015

1
エスケープせずに特殊文字を使用できるため、ベストアンサーIMO
ReneGAED '26 / 02/26

1
これは変数でも機能するため、より優れています。
ybenjira 2017

23

アンカーを使用するのが最善の方法ですが、ここに私がやっていることがあります:

grep -w "ABB.log " a.tmp

このように..最初の行の一致を返します
user765443

1
これにはの後ABB.logにスペースが必要ですが、これは一般的なケースではありません。つまり、ほとんどの場合失敗します。
Jahid 2015

3

ファイルが手動で編集されている場合に問題となる、先頭または末尾のスペースが1つだけある場合、ほとんどの提案は失敗します。これにより、その場合の影響を受けにくくなります。

grep '^[[:blank:]]*ABB\.log[[:blank:]]*$' a.tmp

シェルの単純なwhile-readループはこれを暗黙的に実行します。

while read file
do 
  case $file in
    (ABB.log) printf "%s\n" "$file"
  esac
done < a.tmp


1

OPの試みやその他の答えについても説明を加えたいと思います。

次のようなJohn Kugelmansのソリューションも使用できます。

grep -x "ABB\.log" a.tmp

文字列を引用してドット(.)をエスケープすると、-Fフラグが不要になります。

.(ドット)をエスケープするか(エスケープされていない場合は(だけでなく)すべての文字に一致するため.-F、grepでフラグを使用する必要があります。-Fフラグはそれを固定文字列にします(正規表現ではありません)。

文字列を引用符で囲まない場合、ドット(.)をエスケープするために二重のバックスラッシュが必要になることがあります。

grep -x ABB\\.log a.tmp


テスト:

$ echo "ABBElog"|grep -x  ABB.log
ABBElog #matched !!!
$ echo "ABBElog"|grep -x  "ABB\.log"
#returns empty string, no match


注意:

  1. -x 行全体と一致するように強制します。
  2. フラグ.なしの非エスケープを使用した回答-Fは間違っています。
  3. -xパターン文字列を^とでラップすることで、スイッチを回避できます$。この場合、メイクには必ずでは使用しない-Fエスケープ代わりに、.ので、-Fの正規表現の解釈を防ぐことができます^し、$


編集: (@hakreに関して追加の説明を追加):

で始まる文字列を照合する-場合は--、grep を使用する必要があります。以下--は何でも入力として扱われます(オプションではありません)。

例:

echo -f |grep -- "-f"     # where grep "-f" will show error
echo -f |grep -F -- "-f"  # whre grep -F "-f" will show error
grep "pat" -- "-file"     # grep "pat" "-file" won't work. -file is the filename

実際に-Fが欠落していることを体験しましたか?もしそうなら、あなたはそれがどちらのケースであったか言ってもらえますか?
2015

@hakre私の答えを完全に読みましたか?私は(かなり明確に)が適切にエスケープされて-Fいれば必要ない理由を説明しました.
Jahid

承知しました。確かに、私はただ尋ね-Fています。これを書いたときに利用できましたか?そうでない場合、どのシステムを使用していましたか?これまでのところ、回答にその情報が見つかりませんでした。今でも、もう一度読んでみます。確かに、私はあなたの答えを少なくとも2回は完全に読みました。;)
2015

@hakreもちろん-F利用できました。(私は言いました: "または-Fフラグと一緒にgrep"を使用してください)
Jahid

洞察をありがとう。残りの質問が1つだけ残っ-Fています。答えが正解である場合、なぜ脱出する必要があるのでしょうか。それについてどう思いますか?
2015


-1
    $ cat venky
    ABB.log
    ABB.log.122
    ABB.log.123

    $ cat venky | grep "ABB.log" | grep -v "ABB.log\."
    ABB.log
    $

    $ cat venky | grep "ABB.log.122" | grep -v "ABB.log.122\."
    ABB.log.122
    $

1
これは、ABB.logで終わるファイルにも一致し、ドットはエスケープする必要があります。
Scrutinizer 2013年

-1

私のために働く

grep "\bsearch_word\b" text_file > output.txt  

\b 境界を示し/設定します。

かなり速く動作するようです


これはsearch_word、単語の境界で区切られている行にも一致します。たとえば、「foo search_word bar」という行と一致します。
Rohan Singh

-2

これはHPUXの場合であり、ファイルのコンテンツに単語間にスペースがある場合は、次のように使用します。

egrep "[[:space:]]ABC\.log[[:space:]]" a.tmp


OPは、行内のスペースで区切られた単語ではなく、行全体に一致することを望んでいました。
キース・トンプソン


-3

私はこの機能が必要でしたが、ABB.logの前にプレフィックスが付いた行を返さないようにしたかったのです。

  • ABB.log
  • ABB.log.122
  • ABB.log.123
  • 123ABB.log

grep "\WABB.log$" -w a.tmp

これは\W、空白以外の文字であるリーディングが満たされている場合にのみ一致しxABBxlogます。
bschlueter 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.