Ответ 1
Просто укажите привязки regexp.
grep '^ABB\.log$' a.tmp
У меня есть:
$ 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?
Просто укажите привязки regexp.
grep '^ABB\.log$' a.tmp
grep -Fx ABB.log a.tmp
На странице grep man:
-F, --fixed-strings
Интерпретировать PATTERN как (список) фиксированных строк
-x, -line-regexp
Выберите только те совпадения, которые точно соответствуют всей строке.
Вот что я делаю, хотя использование якорей - лучший способ:
grep -w "ABB.log " a.tmp
аналогично awk
awk '/^ABB\.log$/' file
Большинство предложений не удастся, если их будет только одно ведущее или конечное пространство, что имеет значение, если файл редактируется вручную. Это сделало бы его менее восприимчивым в этом случае:
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
Я намерен добавить дополнительное объяснение относительно попыток 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
будет препятствовать интерпретации регулярных выражений ^
и $
.
Если вы хотите совместить строку, начинающуюся с -
, то вы должны использовать --
с 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
Мне нужна эта функция, но я также хотел убедиться, что я не возвращал строки с префиксом перед ABB.log:
grep "\WABB.log$" -w a.tmp
Я бы предпочел:
str="ABB.log"; grep -E "^${str}$" a.tmp
веселит