web-dev-qa-db-ja.com

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

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

$ 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を使用して必要なものを取得できますか?

91
Johnyy

正規表現のアンカーを指定するだけです。

grep '^ABB\.log$' a.tmp
94
user562374
grep -Fx ABB.log a.tmp

Grepのmanページから:

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

134
John Kugelman

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

grep -w "ABB.log " a.tmp
24
PranavKN

同様にawkで

 awk '/^ABB\.log$/' file
2
ghostdog74

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

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

Shellの単純なwhile-readループは、これを暗黙的に行います。

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

同様のことをしようとすると、これはうまくいきました:

grep -F ABB.log a.tmp
1
Fred Christophe