Grep для специальных символов в Unix
У меня есть файл журнала (application.log), который может содержать следующую строку нормальных и специальных символов на нескольких строках:
*^%Q&$*&^@$&*!^@$*&^&^*&^&
Я хочу найти номер строки, содержащий эту специальную строку символов.
grep '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log
Вышеприведенная команда не возвращает никаких результатов.
Каким будет правильный синтаксис для получения номеров строк?
Ответы
Ответ 1
Сообщите grep
, чтобы обработать ваш ввод как фиксированную строку с помощью параметра -F
.
grep -F '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log
Для получения номера строки требуется -n
grep -Fn '*^%Q&$*&^@$&*!^@$*&^&^*&^&' application.log
Ответ 2
Тот, который работал у меня, это:
grep -e '->'
Значение -e означает, что следующий аргумент является шаблоном и не будет интерпретироваться как аргумент.
От: http://www.linuxquestions.org/questions/programming-9/how-to-grep-for-string-769460/
Ответ 3
Связанная заметка
В 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
Ответ 4
grep -n "\*\^\%\Q\&\$\&\^\@\$\&\!\^\@\$\&\^\&\^\&\^\&" test.log
1:*^%Q&$&^@$&!^@$&^&^&^&
8:*^%Q&$&^@$&!^@$&^&^&^&
14:*^%Q&$&^@$&!^@$&^&^&^&
Ответ 5
Вы можете попробовать удалить любые буквенно-цифровые символы и пробел. И затем используйте -n
, чтобы указать номер строки. Попробуйте следующее:
grep -vn "^[a-zA-Z0-9 ]*$" application.log
Ответ 6
Попробуйте vi с опцией -b, это покажет специальные символы конца строки
(Я обычно использую его, чтобы видеть окончания строк Windows в txt файле в ОС Unix)
Но если вы хотите, чтобы скрипт-решение явно не работал, вы можете попробовать опции -f или -e с помощью grep и передать результат в sed или awk.
На странице grep man:
Выбор контролера -E, --extended-regexp Интерпретировать PATTERN как расширенное регулярное выражение (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.)