Как сделать 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?
12 ответов:
grep -Fx ABB.log a.tmpиз справочной страницы grep:
- F, --fixed-strings
Интерпретировать шаблон как (список) фиксированных строк
- x, --line-regexp
Выберите только те совпадения, которые точно соответствуют всей линии.
большинство предложений не удастся, если есть столько, сколько один ведущий или конечный пробел, который будет иметь значение, если файл редактируется вручную. Это сделало бы его менее восприимчивым в этом случае:
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
Отмечать:
-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
для меня:
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
Мне нужна была эта функция, но также хотелось убедиться, что я не возвращаю строки с префиксом перед ABB.журнал:
- ABB.журнал
- ABB.бревно.122
- ABB.бревно.123
- 123ABB.журнал
grep "\WABB.log$" -w a.tmp
Comments