2013-10-01 6 views
2

У меня возникли проблемы с регулярными выражениями grep. Я пытаюсь Grep некоторые ASCii кодированные данные шестнадцатеричные, где символы являются строчными буквамиgrep регулярное выражение, не соответствующее нулевому правилу

Мой Grep заявление выглядит следующим образом:

grep -E "01[a-f0-9]{2}81[a-f0-9]0" log.log 

Большинство матчей в файле выглядят нормально, за исключением того, существуют многочисленные которые являются следующими:

010481ec070000 
01b481ec070000 
01508129070521 

Не могу понять, почему эти строки соответствуют. Они не должны совпадать, потому что за 81 должен следовать шестнадцатеричный символ, а затем нуль.

Я провел некоторое дальнейшее расследование. Если я помещаю эти три строки в отдельный файл и grep этот файл. У меня нет матчей. Не совсем уверен, что здесь происходит.

Это grep 2.12.

здесь является частью необработанных данных в файле. Это все линии, которые соответствуют. И все-таки совпадают после экспорта LC_ALL = C

input data : 011a81a907000b3002004070eaa3d2240fa81272011763dd0040002001 
input data : 010481e1070000 
input data : 010481ea070000 
input data : 011a81a207000b980f0040681f2b11d2f60202dc003669ba0140006100 
input data : 014681ab07002140010040d2e457f8c00494ed5e014362bf0240006101ae0500404ee311f402feb2165401c562450240005801db08044068f09ff6a6005af953008062470640004d01 
input data : 010481e3070000 
input data : 013081ac070016c0000040f6d963fcb4f7e8127c0103637b0140006f01bf0200408ae344fdd2043eed72018362a30240006f01 
input data : 010481e4070000 
input data : 011a81ad07000b5c06006064f96804901154fed2008e66ff0f4000a401 
input data : 010481e5070000 
input data : 014681ae070021170d004069f196134cf6a805b4000769b6034000be014e0e004092e80820da0b82fbfa000c6c5c014000bf01880a004020d9ce21f4efd40954011469a1004000ae01 
input data : 011a81a607000bef0d0060d60dd6edf8f18e104e015b63d3014000da00 
input data : 011a81af07000b4c0800401cfbb0184a0c28f7fa00516931024000e101 
input data : 015c81a007002c12050020f2ff640028007afd00801205f70540000400280c00404f016a0a10fbd0012a00e769ff0f400018005d020040e3fabd21e00830f4d200c769d80140000300030a004042030 
+0

выглядит как старая версия grep! – iamauser

+0

здесь, не найдено по команде grep с вашим вводом (3 строки). grep ver 'gnu grep 2.14' – Kent

+3

Что-то рыбное. Я тоже не могу воспроизвести ваши результаты, и регулярное выражение достаточно просто, что ошибка очень маловероятна. Вы УВЕРЕНЫ, что вы показываете нам исполняемое регулярное выражение, И все строки ввода? Может ли это соответствовать другой части строки, которую вы не показывали? Вы не привязываетесь к началу или концу строки ... –

ответ

0

Попробуйте выполнить ее с переменной окружения LC_ALL=C. Локаль влияет на способ, которым grep интерпретирует диапазоны символов.

0

Предполагая, что команда точно так же, как вы говорите ... Кавычки правы, пока не будет глобуса имени файла, прежде чем grep получит аргументы, у вас нет {0} вместо 0 и т. Д.

Удивительно, что виновником является -a (обращение к двоичному файлу как текст). Двоичный выход может обрабатываться терминалом. (Вот как мы меняем цвета или позиционируем проклятия или что-то еще.)

Что делать, если у вас есть двоичный код там, где стерта часть линии? Скажем, контрольно-H в ...

Что произойдет, если вы передадите выход Grep через спосы -c (или, возможно, ода -a или спосо -т, если у вас есть) ,

Что произойдет, если вы сохраните вывод в файле, вытащите только одну такую ​​строку с помощью grep и посмотрите на него с помощью od?

Смежные вопросы