grep для спеціальних символів в Unix


94

У мене є файл журналу (application.log), який може містити такий рядок звичайних та спеціальних символів у декількох рядках:

*^%Q&$*&^@$&*!^@$*&^&^*&^&

Я хочу знайти номер рядка, який містить цей рядок спеціальних символів.

grep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log

Вищенаведена команда не повертає жодних результатів.

Яким буде правильний синтаксис для отримання номерів рядків?


^@: означає, ^за яким слідує @або нульовий символ?
Nahuel Fouilleul

Відповіді:


156

Запропонуйте grepобробляти свої дані як фіксований рядок, використовуючи -Fопцію.

grep -F '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log

Опція -nпотрібна, щоб отримати номер рядка,

grep -Fn '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log

7
В залежності від вашої версії Grep вам потрібно тільки бігти (з зворотної косої межі) ^, $, ., *і \ . або ви також можете спробувати fgrep.
Nahuel Fouilleul

2
@NahuelFouilleul: +1. До речі, fgrepце те саме, що grep -F.
Принц Джон Веслі

@PrinceJohnWesley: це те саме, але в деяких системах існує багато версій grep, тому за допомогою fgrep можна знайти версію, яка підтримує -F
Nahuel Fouilleul

Що робити, якщо він користується egrep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log?
inckka

Не працює. grep -rinF '-static'відбитки Invalid option «t». Відповідь @ Mani спрацювала , тобто grep -rin "\-static".
Hi-Angel

92

Той, який працював у мене:

grep -e '->'

Значення -e означає, що наступний аргумент є шаблоном і не буде інтерпретований як аргумент.

З: http://www.linuxquestions.org/questions/programming-9/how-to-grep-for-string-769460/


str = '! "# $% & () * +, -. /:; <=>? @ [\] ^ _` {|} ~ '; echo "$ str" | grep -e "$ str" ..... НЕ РОБОЧИЙ, те, що працювало для вас, не мало достатньо спеціальних символів, крім знака перемикача '-', але win -F замість -e ПРАЦЮЄ!
THESorcerer

1
У мене працює єдине, навіть '\' або -F або fgrep не працюють. Дякую!
user180574

2
Це повинна бути прийнята відповідь - проста і працює для grep
Ishay Peled

1
Спробував -F та fgrep не працює для мене при пошуку рядка, включаючи '-' char. Це працює.
世界 知名 伟人

Мені цікаво, чому ця відповідь присутня у цьому питанні ( stackoverflow.com/q/12387685 для посилання на запитання та відповіді, які я зараз переглядаю) - ймовірно, помилковий випадок, коли відповіді об’єднані з іншого питання? Для пошуку моделей , починаючи з -, дивись також stackoverflow.com/questions/2427913 / ...
Sundeep

6

Пов’язана примітка

Щоб отримати grep для повернення каретки, а саме \rперсонажа, або 0x0d, ми можемо зробити це:

grep -F $'\r' application.log

Крім того, використовуйте printfабо echoдля сумісності POSIX

grep -F "$(printf '\r')" application.log

І ми можемо використовувати hexdump, або , lessщоб побачити результат:

$ printf "a\rb" | grep -F $'\r' | hexdump -c
0000000   a  \r   b  \n

Щодо використання $'\r'та інших підтримуваних символів, див. Посібник Bash> Цитування ANSI-C :

Слова форми $ 'string' трактуються спеціально. Слово розширюється до рядка, при цьому символи зі зворотною косою рискою замінюються відповідно до стандарту ANSI C.


3
grep -n "\*\^\%\Q\&\$\&\^\@\$\&\!\^\@\$\&\^\&\^\&\^\&" test.log
1:*^%Q&$&^@$&!^@$&^&^&^&
8:*^%Q&$&^@$&!^@$&^&^&^&
14:*^%Q&$&^@$&!^@$&^&^&^&

2

Ви можете спробувати видалити будь-які буквено-цифрові символи та пробіл. А потім використання -nдасть вам номер рядка. Спробуйте наступне:

grep -vn "^[a-zA-Z0-9 ]*$" application.log


Дякую .. Мені вдається знайти спеціальні символи у файлі.
Діпанкар Налуй

-4

Спробуйте vi за допомогою параметра -b, це покаже спеціальні символи кінця рядка (я зазвичай використовую його, щоб побачити закінчення рядків Windows у текстовому файлі в ОС Unix)

Але якщо ви хочете, щоб скриптове рішення, очевидно, не працюватиме, тож ви можете спробувати параметри -f або -e за допомогою grep і перевести результат в sed або awk. Зі сторінки користувача grep:

Вибір відповідника -E, --extended-regexp Інтерпретувати Шаблон як розширений регулярний вираз (ERE, див. Нижче). (-E вказано POSIX.)

   -F, --fixed-strings
          Interpret PATTERN as a list of fixed strings, separated by newlines, any of which is to be matched.  (-F is specified
          by POSIX.)

2
Яким чином це краще, ніж прийнята відповідь, отже, ви додали її до майже 5-річного запитання?
SergGr
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.