Не удается подставить переменную в образец для sgrep

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

nick87720z
Сообщения: 180
ОС: Gentoo / Calculate

Не удается подставить переменную в образец для sgrep

Сообщение nick87720z »

Если просто наборать

Код: Выделить всё

cat $IN_TMP_FILE | sgrep -o "%s:%r\n" '"Remote system\naddress"'

то никаких проблем. Но если образец записать в переменную (со всеми кавычками, естесственно) и подставить в команду или сгенерить его с помощью `echo "'\"$line\""` ....

Код: Выделить всё

sgrep_arg="'\"$line\"'"
cat $IN_TMP_FILE | sgrep -o "%s:%r\n" $sgrep_arg
# Или даже так
sgrep_cmd='sgrep -o "%s:%r\n"'"'\"$line\"'"
cat $IN_TMP_FILE | $sgrep_cmd
# Кстати, если занести в переменную все вместе с cat, то cat жалуется на неверный параметр  :crazy:

то выдает

Код: Выделить всё

Parse error in command line expression column 1 :
    Invalid character
'"Remote
^
No query to evaluate. Bailing out.


В мануале смотрел примеры, чтобы лучше понять, как составлять образцы, но подстановки переменных там нет.
В гугле в основном, ссылки на код sgrep :laugh:
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: Не удается подставить переменную в образец для sgrep

Сообщение /dev/random »

В шелле кавычки обрабатываются до подстановки переменных.

Код: Выделить всё

echo 'bla bla'

и

Код: Выделить всё

a="'bla bla'"; echo $a
- не одно и то же.
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Не удается подставить переменную в образец для sgrep

Сообщение sash-kan »

не вижу проблемы:

Shell

$ cat /var/log/messages | sgrep -o "%s:%r\n" '"restart.\nMar"' 38:restart. Mar 2357:restart. Mar 4950:restart. Mar 7301:restart. Mar $ s='"restart.\nMar"' $ cat /var/log/messages | sgrep -o "%s:%r\n" $s 38:restart. Mar 2357:restart. Mar 4950:restart. Mar 7301:restart. Mar
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали:
nick87720z
Сообщения: 180
ОС: Gentoo / Calculate

Re: Не удается подставить переменную в образец для sgrep

Сообщение nick87720z »

Код: Выделить всё

line=`echo -n "$line" | tr '"' '\n' | grep -v "msgid" | tr -d '\n'`       ; echo "Processed line: $line"
line="'\""$line"\"'"                                                      ; echo "sgrep arg: $line"
cat $IN_TMP_FILE | sgrep -o "%s:%r\n" $line

Ответ

Код: Выделить всё

Processed line: Remote system\naddress
sgrep arg: '"Remote system\naddress"'
Parse error.....           #  ))))))
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: Не удается подставить переменную в образец для sgrep

Сообщение /dev/random »

Ну куда вы столько кавычек наворотили?
Спасибо сказали:
nick87720z
Сообщения: 180
ОС: Gentoo / Calculate

Re: Не удается подставить переменную в образец для sgrep

Сообщение nick87720z »

Переменная изначально без кавычек. Если верить выводу, я все делаю правильно. Даже пробовал прямо по sash-kan

Код: Выделить всё

line='"Remote system\naddress"'
cat $IN_TMP_FILE | sgrep -o "%s:%r\n" $line

Все равно ругается. Если что, у меня GNU bash, version 3.2.48(1)-release
sash-kan, вы это не в sash делали? Хотя какая разница...
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Не удается подставить переменную в образец для sgrep

Сообщение drBatty »

в шеле то что внутри одиночных кавычек вообще не обрабатывается и ничего не раскрывается. Исключения - некоторые ESC символы, вроде \a,\n,\b и проч.

Переменные внутри двойных кавычек раскрываются, кроме того, одиночная кавычка внутри двойных считается обычным символом.

"'\""$line"\"'"

на самом деле три строки записанные друг за другом (вплотную)
"'\"" Это одиночная и за ней двойная кавычка
$line переменная
"\"'" это двойная и затем одиночная кавычка, в итоге, если в line равно 1, то всё выражение
'"1"'
Я, если честно, так и не понял, чего вы хотите этим всем добится...
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5404
ОС: Gentoo

Re: Не удается подставить переменную в образец для sgrep

Сообщение /dev/random »

nick87720z писал(а):
24.03.2010 12:54
Переменная изначально без кавычек. Если верить выводу, я все делаю правильно. Даже пробовал прямо по sash-kan

Код: Выделить всё

line='"Remote system\naddress"'
cat $IN_TMP_FILE | sgrep -o "%s:%r\n" $line

Нет, нет и ещё раз нет. Таким способом вы передадите sgrep'у 4 параметра:
-o
"%s:%r\n"
"Remote
system\naddress"

Повторяю, кавычки обрабатываются ДО подстановки переменных. И те кавычки, что были внутри переменной, уже считаются просто символами.
Спасибо сказали:
nick87720z
Сообщения: 180
ОС: Gentoo / Calculate

Re: Не удается подставить переменную в образец для sgrep

Сообщение nick87720z »

Код: Выделить всё

line="\"$line\""
cat $IN_TMP_FILE | sgrep -o "%s:%r\n" "$line"

Работает!

P.S. Отредактировал, т.к. в прошлый раз намутил кавычек :D
P.P.S.

Код: Выделить всё

cat $IN_TMP_FILE | sgrep -o "%s:%r\n" "\"$line\""

Если тему удалят, не обижусь :laugh:
Спасибо сказали:
Аватара пользователя
sash-kan
Администратор
Сообщения: 13939
Статус: oel ngati kameie
ОС: GNU

Re: Не удается подставить переменную в образец для sgrep

Сообщение sash-kan »

ага, действительно, в моём примере пробела не было.
ну, значит, надо в кавычки переменную заключить:
$ sgrep -o "%s:%r\n" "$s"

Shell

$ s='"5: restart.\nMar"' $ cat /var/log/messages | sgrep -o "%s:%r\n" "$s" 35:5: restart. Mar 2354:5: restart. Mar 4947:5: restart. Mar 7298:5: restart. Mar $

всего одни кавычки добавить. не более. а вы, уважаемый nick87720z, опять какие-то длинные конструкции строите. всё гораздо проще (улыбка).
Писать безграмотно - значит посягать на время людей, к которым мы адресуемся, а потому совершенно недопустимо в правильно организованном обществе. © Щерба Л. В., 1957
при сбоях форума см.блог
Спасибо сказали: