URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1586
[ Назад ]

Исходное сообщение
"Удивительная GREP"

Отправлено Bootmen , 11-Апр-03 22:19 
Меня странно подвела известная утилитка grep
Оказывается она не видит и пропускает строки начинающиеся
с символа ^@
Нигде в литературе такого не встречал-только пишут что grep универсальная
и пользуйтесь ей в поиске и по текствовым и в бинарных файлах. (ну и дела)
Теперь приходится подстраховыватся таким способом:
cat -v file | grep "patern"



Содержание

Сообщения в этом обсуждении
"Удивительная GREP"
Отправлено jk , 12-Апр-03 17:11 
grep ^@ означает что нужно найти строку первый символ которой @
а не найти строки с сочетанием ^@
символ ^ означает начало строки
чтобы найти ^@ нужно юзать grep [^@] - AFAIK



"Удивительная GREP"
Отправлено Bootmen , 15-Апр-03 03:42 
>grep ^@ означает что нужно найти строку первый символ которой @
>а не найти строки с сочетанием ^@
>символ ^ означает начало строки
>чтобы найти ^@ нужно юзать grep [^@] - AFAIK

Я наверное неправильно выразился:
^@ это один управляющий символ а не два - то есть \000 или NULL.

Есть  к примеру такой файл file1 :

llsafdjk
@^@^@^@^ABCD^@^@
nnnn

Мне нужно удостоверится что в нем содержится строки с ABCD
Делаю скрипт:
:
#
grep "ABCD" file1 2> /dev/null || {echo "ABCD в $0 не найдено!"; exit 0}
echo " Все нормально!" ; exit 0
#

Результат:
# ABCD в file1 не найдено!
#
Если я сделаю так:
:
#
cat -v file1 | grep "ABCD"  2> /dev/null || {
echo "ABCD в $0 не найдено!"; exit 0
}
echo " Все нормально!" ; exit 0
#
Результат будет:
# Все нормально!

Нигде я в описаниях и ман я такого случая не читал и в итоге немного
прогорел.


"Удивительная GREP"
Отправлено jk , 15-Апр-03 12:08 
#!/bin/bash
#first parameter is a filename where expression
#which stored in second parameter must be searched
cat $1|grep $2 > /dev/null
if [ $? -eq 0 ];then
    echo "$2 occured in $1"
else
    echo "no $2 occured in $1"
fi

"Удивительная GREP"
Отправлено Bootmen , 16-Апр-03 13:42 
>#!/bin/bash
>#first parameter is a filename where expression
>#which stored in second parameter must be searched
>cat $1|grep $2 > /dev/null
>if [ $? -eq 0 ];then
>    echo "$2 occured in $1"
>else
>    echo "no $2 occured in $1"
>fi

Странно,  но вышенаписанное есть тоько копия моего скрипта (но в bsh)
Я то вобщето хотел сообщить о непонятном поведении утилитки GREP
когда она встречает в тексте управляющий символ ^@ (NULL)..


"Удивительная GREP"
Отправлено jk , 16-Апр-03 19:22 
не понял я чего-то
у меня этот скрипт работал без всяких глюков

"Удивительная GREP"
Отправлено Bootmen , 21-Апр-03 18:15 
>не понял я чего-то
>у меня этот скрипт работал без всяких глюков

Дорогой мой оппонент!
Речь не идет о примитивных шелл скриптах
Я всего лишь хотел предупредить о поведении утилиты GREP
Создайте файл в котором строки начинаются с управляющего
символа ^@
И утилилита GREP ничего!
НИЧЕГО! в в этом файле не найдет.
Что бы вы ей не задавали а аргументах.
Наконец вам пример:
^@ abcd
grep abcd file
#
Не видит она строки с начинающиеся с ^@
Это один знак ^@
В VI ПРекрасно видно..


"Удивительная GREP"
Отправлено Bootmen , 21-Апр-03 18:32 
abcd
>grep abcd file
>#
>Не видит она строки с начинающиеся с ^@
>Это один знак ^@
>В VI ПРекрасно видно..


Я к чему это говорю-
Некоторые хитро@опые программеры создают файлы в своих коммерческих
пакетах стабильной длины.
И забивают их символами ^@
А мне то тоже хоца там порытся...


"Удивительная GREP"
Отправлено poige , 28-Апр-03 06:51 
>Меня странно подвела известная утилитка grep
>Оказывается она не видит и пропускает строки начинающиеся
>с символа ^@

Мои опыты с оной:

$cat gg
test
rest

$cat -v gg
^@test
^@rest

$od -t a gg
0000000  nul   t   e   s   t  nl nul   r   e   s   t  nl                
0000014

$grep rest gg
Binary file gg matches

$grep test gg
Binary file gg matches

$grep est gg
Binary file gg matches

$grep -a est gg
test
rest

работает как в Linux, так и во FreeBSD.

/poige
--
http://www.morning.ru/~poige/