Конфликт переменных в awk

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

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

Аватара пользователя
amorphius
Сообщения: 353
ОС: Ubuntu

Конфликт переменных в awk

Сообщение amorphius »

Есть такой код

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

awk "/^$date(.*)$/ { print($1, $2) }" $filename

...не работает. Оттого, я так подозреваю, что возникает конфликт: что такое $1 - первый аргумент скрипта или же первое слово строки, удовлетворяющей шаблону?
Как быть, кто знает?
И еще вопрос: кто подскажет как экранировать переменную $date, ибо в ней могут быть символы типа "./?*\"
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Конфликт переменных в awk

Сообщение watashiwa_daredeska »

amorphius писал(а):
04.11.2009 23:21
что такое $1 - первый аргумент скрипта или же первое слово строки, удовлетворяющей шаблону?
Первый аргумент скрипта в данном случае. Либо \$, либо писать в одинарных кавычках.
amorphius писал(а):
04.11.2009 23:21
кто подскажет как экранировать переменную $date, ибо в ней могут быть символы типа "./?*\"
date=$(echo "$date" | sed 's%[].\?+*|$^(){}[]%\\&%g')
Спасибо сказали:
Аватара пользователя
amorphius
Сообщения: 353
ОС: Ubuntu

Re: Конфликт переменных в awk

Сообщение amorphius »

watashiwa_daredeska писал(а):
04.11.2009 23:31
Первый аргумент скрипта в данном случае. Либо \$, либо писать в одинарных кавычках.

спасибо, помогло
date=$(echo "$date" | sed 's%[].\?+*|$^(){}[]%\\&%g')

спасибо, почти помогло, вот бы еще расшифровочку, а то не все понятно)
s - это ж замена всего шаблона, разве тут не tr надо?
не пропускает формат даты типа 4/11/2009 - синтакс эррор.
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Конфликт переменных в awk

Сообщение watashiwa_daredeska »

amorphius писал(а):
04.11.2009 23:41
вот бы еще расшифровочку, а то не все понятно
s%[].\?+*|$^(){}[]% — шаблону соответствует любой из символов: ].\?+*|$^(){}[ (один и только один)
%\\&то-что-соответствует-шаблону заменяется на \то-что-соответствует-шаблону
%g — заменить все вхождения, а не только первое.

amorphius писал(а):
04.11.2009 23:41
не пропускает формат даты типа 4/11/2009 - синтакс эррор.
Да, прямой слэш забыл экранировать. Добавьте в список символов для замены.

Может, проще вообще так:

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

awk -v d=$date '$0 ~ "^" d {print $1, $2}' $filename
?

UPD: хотя, так тоже надо экранировать спецсимволы. Тогда так:

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

awk -v d=$date 'substr($0, 1, length(d)) == d {print $1, $2}' $filename
Спасибо сказали:
Аватара пользователя
amorphius
Сообщения: 353
ОС: Ubuntu

Re: Конфликт переменных в awk

Сообщение amorphius »

а как добавить?
вот так...

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

date=$(echo "$date" | sed 's%\/[].\?+*|$^(){}[]%\\&%g')

...и так...

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

date=$(echo "$date" | sed 's%/[].\?+*|$^(){}[]%\\&%g')

...не работает
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Конфликт переменных в awk

Сообщение watashiwa_daredeska »

date=$(echo "$date" | sed 's%[]/.\?+*|$^(){}[]%\\&%g')
Спасибо сказали:
Аватара пользователя
amorphius
Сообщения: 353
ОС: Ubuntu

Re: Конфликт переменных в awk

Сообщение amorphius »

спасибо, работает. А почему нельзя ставить первым прямой слэш?
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Конфликт переменных в awk

Сообщение watashiwa_daredeska »

info sed
Спасибо сказали: