Как сделать 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?

Ответ 1

Просто укажите привязки regexp.

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

Ответ 2

grep -Fx ABB.log a.tmp

На странице grep man:

-F, --fixed-strings
Интерпретировать PATTERN как (список) фиксированных строк
-x, -line-regexp
Выберите только те совпадения, которые точно соответствуют всей строке.

Ответ 3

Вот что я делаю, хотя использование якорей - лучший способ:

grep -w "ABB.log " a.tmp

Ответ 4

аналогично awk

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

Ответ 5

Большинство предложений не удастся, если их будет только одно ведущее или конечное пространство, что имеет значение, если файл редактируется вручную. Это сделало бы его менее восприимчивым в этом случае:

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

Простой while-read loop в shell сделает это неявно:

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

Ответ 6

Я намерен добавить дополнительное объяснение относительно попыток OP и других ответов.

Вы можете использовать решение Джона Кугельманса так:

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


Примечание:
  • -x принудительно соответствует всей строке.
  • Ответы с использованием неэкранированного . без -F флага ошибочны.
  • Вы можете избежать переключения -x, обернув строку шаблона с помощью ^ и $. В этом случае убедитесь, что вы не используете -F, а избегаете ., потому что -F будет препятствовать интерпретации регулярных выражений ^ и $.


EDIT: (Добавление дополнительного объяснения в отношении @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

Ответ 7

Это сработало для меня, когда я пытаюсь сделать что-то подобное:

grep -F ABB.log a.tmp

Ответ 8

Работает для меня:

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

\b указывает/устанавливает границы.

Кажется, работает довольно быстро

Ответ 9

    $ 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
    $

Ответ 10

Это с помощью HPUX, если содержимое файлов имеет пробел между словами, используйте это:

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

Ответ 11

Мне нужна эта функция, но я также хотел убедиться, что я не возвращал строки с префиксом перед ABB.log:

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

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

Ответ 12

Я бы предпочел:

str="ABB.log"; grep -E "^${str}$" a.tmp

веселит