Как сделать grep только совпадение, если вся линия соответствует?



у меня есть это:



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


Я хотел найти точное совпадение ABB.бревно.



но когда я это сделал



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


он показывает их все.



могу ли я получить то, что я хотел с помощью grep?

602   12  

12 ответов:

просто укажите якоря.

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

из справочной страницы grep:

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

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

grep -w "ABB.log " a.tmp

аналогично с awk

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

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

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

я намерен добавить некоторые дополнительные объяснения относительно попыток 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


Отмечать:
  1. -x силы, чтобы соответствовать всей линии.
  2. ответы с использованием не экранированного . без -F флаг не правы.
  3. вы можете избежать -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

Это хорошо работало для меня при попытке сделать что-то подобное:

grep -F ABB.log a.tmp

для меня:

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

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

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

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

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

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

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

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

ура

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

  • ABB.журнал
  • ABB.бревно.122
  • ABB.бревно.123
  • 123ABB.журнал

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

Comments

    Ничего не найдено.