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

95

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

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

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

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

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

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

Авинаш Сони
источник
^@: значит, ^за которым следует @или нулевой символ?
Nahuel Fouilleul

Ответы:

159

Скажите , 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». В @ Мани ответ работал , то есть grep -rin "\-static".
Hi-Angel
93

У меня сработало следующее:

grep -e '->'

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

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

Том Брито
источник
str = '! "# $% & () * +, -. /:; <=>? @ [\] ^ _` {|} ~ '; echo "$ str" | grep -e "$ str" ..... НЕ РАБОТАЕТ, то, что сработало для вас, не имело достаточно специальных символов, кроме знака переключателя '-', но победа -F вместо -e
РАБОТАЕТ
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 :

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

ryenus
источник
3
grep -n "\*\^\%\Q\&\$\&\^\@\$\&\!\^\@\$\&\^\&\^\&\^\&" test.log
1:*^%Q&$&^@$&!^@$&^&^&^&
8:*^%Q&$&^@$&!^@$&^&^&^&
14:*^%Q&$&^@$&!^@$&^&^&^&
Мани
источник
2

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

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

Р. Кумар
источник
Спасибо .. Мне хорошо удается найти специальные символы из файла.
Dipankar Nalui
-4

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

Но если вам нужно решение со сценарием, очевидно, vi не будет работать, поэтому вы можете попробовать параметры -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.)
user7648830
источник
2
Чем это лучше принятого ответа, поэтому вы добавили его к вопросу, которому уже почти 5 лет?
SergGr 02