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


у меня есть файл журнала (приложение.log), который может содержать следующую строку обычных и специальных символов в нескольких строках:

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

Я хочу найти номер(ы) строки, которая содержит эту специальную символьную строку.

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

эта команда не возвращает никаких результатов.

что бы быть правильный синтаксис, чтобы получить номера строк?

6 68

6 ответов:

рассказать grep для обработки ввода как фиксированной строки с помощью .

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

опции -n требуется, чтобы получить номер строки

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

тот, который работал для меня-это:

grep -e '->'

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

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

Примечание

в 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 Manual > ANSI-C Quoting:

слова вида $ 'string' обрабатываются специально. Слово расширяется до строки, с обратными косыми чертами-экранированные символы заменяются, как указано в стандарте ANSI C

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

вы можете попробовать удалить любые буквенно-цифровые символы и Пробел. А потом использовать -n даст вам номер строки. Попробуйте следующее:

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

попробуйте vi с опцией-b, это покажет специальный конец символов строки (Обычно я использую его для просмотра окончаний строк windows в txt-файле на ОС unix)

но если вы хотите, чтобы скриптовое решение, очевидно, vi не будет работать, поэтому вы можете попробовать варианты-f или-e с grep и передать результат в sed или awk. Из справочной страницы grep:

Выбор Совпадений -Е --расширенного регулярного выражения Интерпретируйте шаблон как расширенное регулярное выражение (здесь, см. ниже). (-Е задается 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.)