У меня есть такие:
$ 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?
sed -r "s/^(.*)$/^\1$/" patterns.txt | egrep -f - a.tmp
На странице руководства grep:
источник
-F
? ты на солярисе? Если да, то используйте/usr/xpg4/bin/grep
grep
внутри сценария bash, и этот вариант лучше, чем использование регулярного выражения, как предлагается в принятом ответе. Потому что у меня есть специальный символ внутри переменной, которую я ищу (например,.
), и мне не нужно избегать их при использовании команды.Вот что я делаю, хотя якоря - лучший способ:
источник
ABB.log
, что не является общим случаем, т. Е. В большинстве случаев он не работает.Большинство предложений не будут выполнены, если будет хотя бы один начальный или конечный пробел, что будет иметь значение, если файл редактируется вручную. Это сделает его менее уязвимым в этом случае:
Простой цикл while-read в оболочке сделает это неявно:
источник
аналогично с awk
источник
Я намерен добавить некоторые дополнительные пояснения относительно попыток OP и других ответов.
Вы также можете использовать решение Джона Кугельмана следующим образом:
заключение строки в кавычки и экранирование точки (
.
) делает-F
флаг больше не нужен .Вам нужно экранировать
.
(точку) (потому что он соответствует любому символу (не только.
), если он не экранирован) или использовать-F
флаг с grep.-F
flag делает его фиксированной строкой (не регулярным выражением).Если вы не заключаете строку в кавычки, вам может потребоваться двойная обратная косая черта, чтобы избежать точки (
.
):Тест:
Примечание:
-x
заставляет соответствовать всей строке..
без-F
флага неверны.-x
switch, заключив строку шаблона в символы^
и$
. В этом случае убедитесь, что вы не используете-F
, а избегаете.
, потому что-F
это предотвратит интерпретацию регулярного выражения^
и$
.РЕДАКТИРОВАТЬ: (Добавление дополнительных пояснений в отношении @hakre):
Если вы хотите сопоставить строку, начинающуюся с
-
, вам следует использовать--
с grep. Все, что--
будет дальше, будет принято как ввод (не вариант).Пример:
источник
-F
он не понадобится, если.
экранирован правильно.-F
доступен, когда вы это писали? Если нет, то какую систему вы использовали? Я пока не смог найти эту информацию в вашем ответе, и даже сейчас, когда я перечитываю ее снова. Так что действительно уверен, я прочитал ваш ответ полностью как минимум дважды. ;)-F
был доступен. (Я сказал: «или используйте-F
флаг сgrep
»)-F
это ответ, зачем беспокоиться о побеге? Каково ваше мнение об этом?У меня это хорошо сработало, когда я пытался сделать что-то подобное:
источник
источник
У меня работает :
\b
указывает / устанавливает границы.Кажется, работает довольно быстро
источник
search_word
разделенные границами слова. Например, это будет соответствовать строке «foo search_word bar».Это с HPUX, если в содержимом файлов есть пробелы между словами, используйте это:
egrep "[[:space:]]ABC\.log[[:space:]]" a.tmp
источник
Я бы предпочел:
ура
источник
ABBxlog
Мне нужна была эта функция, но я также хотел убедиться, что не возвращаю строки с префиксом перед ABB.log:
источник
\W
, то есть любой непробельный символ, поэтомуxABBxlog
.