Подтвердить что ты не робот

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

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

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

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

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

Вышеприведенная команда не возвращает никаких результатов.

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

4b9b3361

Ответ 1

Сообщите grep, чтобы обработать ваш ввод как фиксированную строку с помощью параметра -F.

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

Для получения номера строки требуется -n

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

Ответ 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.)