grep для специальных символов в Unix
у меня есть файл журнала (приложение.log), который может содержать следующую строку обычных и специальных символов в нескольких строках:
*^%Q&$*&^@$&*!^@$*&^&^*&^&
Я хочу найти номер(ы) строки, которая содержит эту специальную символьную строку.
grep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log
эта команда не возвращает никаких результатов.
что бы быть правильный синтаксис, чтобы получить номера строк?
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
, для совместимости с POSIXgrep -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.)