Відповіді:
Просто вкажіть анкери регулярного вибору.
grep '^ABB\.log$' a.tmp
sed -r "s/^(.*)$/^\1$/" patterns.txt | egrep -f - a.tmp
grep -Fx ABB.log a.tmp
Зі сторінки grep man:
-F, --fixed-string
Інтерпретувати PATTERN як (список) фіксованих рядків
-x, --line-regexp
Виберіть лише ті відповідники, які точно відповідають цілому рядку.
-F
? ти на Солярісі? Якщо так, використовуйте/usr/xpg4/bin/grep
grep
сценарій bash, і цей варіант краще, ніж використовувати регулярний вираз, як запропоновано у прийнятій відповіді. Оскільки в змінній, яку я шукаю (люблю .
), я маю спеціальний символ, і мені не потрібно уникати їх під час використання команди.
Ось що я роблю, хоча найкраще використовувати якоря:
grep -w "ABB.log " a.tmp
ABB.log
, що не є загальним випадком, тобто він вийде з ладу більшу частину часу.
Більшість пропозицій не вдасться, якщо є стільки єдиного провідного чи кінцевого простору, що має значення, якщо файл редагується вручну. Це зробило б це менш сприйнятливим у такому випадку:
grep '^[[:blank:]]*ABB\.log[[:blank:]]*$' a.tmp
Простий цикл під час читання в оболонці зробить це неявно:
while read file
do
case $file in
(ABB.log) printf "%s\n" "$file"
esac
done < a.tmp
Я маю намір додати додаткові пояснення щодо спроб ОП та інших відповідей.
Ви також можете використовувати подібне рішення Джона Кугельманса :
grep -x "ABB\.log" a.tmp
Цитування рядка та уникнення крапки ( .
) змушує його більше не потребувати -F
прапор.
Вам потрібно вийти з .
(крапки) (тому що він відповідає будь-якому символу (не тільки .
), якщо не вийшов) або використати -F
прапор із грепом. -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
буде перешкоджати трактуванню регулярних виразів ^
і $
.Якщо ви хочете зіставити рядок, починаючи з -
, тоді вам слід використовувати --
греп. Все, що далі, --
буде сприйматися як вхід (не варіант).
Приклад:
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
-F
він не знадобиться, якщо .
уникнути належним чином.
-F
доступно, коли ви писали це? Якщо ні, то яку систему ви використовували? Я не міг знайти цю інформацію у вашій відповіді, що навіть зараз є випадком, коли я її перечитував ще раз. Тож справді впевнений, я прочитав вашу відповідь повністю хоча б двічі. ;)
-F
було доступно. (Я сказав: "або використовуйте -F
прапор grep
")
-F
відповідь, то чому б не турбуватися про втечу? Яка ваша думка з цього приводу?
Це спрацювало для мене, коли я намагався зробити щось подібне:
grep -F ABB.log a.tmp
$ 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
$
Для мене працює :
grep "\bsearch_word\b" text_file > output.txt
\b
вказує / встановлює межі.
Здається, працює досить швидко
search_word
розділені межею слова. Наприклад, він би відповідав рядку, "foo search_word bar".
Це з HPUX, якщо вміст файлів має проміжок між словами, використовуйте це:
egrep "[[:space:]]ABC\.log[[:space:]]" a.tmp
Я вважаю за краще:
str="ABB.log"; grep -E "^${str}$" a.tmp
ура
ABBxlog
Мені була потрібна ця функція, але також хотілося переконатися, що я не повертав рядки з префіксом перед ABB.log:
grep "\WABB.log$" -w a.tmp
\W
задоволений, а це будь-який символ, який не є пробілом xABBxlog
.