Назад | Перейти на главную страницу

awk + perl + получить два аргумента в синтаксисе awk

пожалуйста, посоветуйте, что не так с моим синтаксисом awk и как его исправить (этот синтаксис находится в моем сценарии ksh), и я запускаю свой сценарий на Linux-машине

Моя цель - получить из файла file.txt только строки, которые находятся между датами:

ИЗ 2012-04-19 К 2012-04-22

замечание - другое решение может быть с perl

[root@test1 /var/tmp]# a='2012/04/19'
[root@test1 /var/tmp]# b='2012/04/22'
[root@test1 /var/tmp]# awk -v A=$a -v B=$b '/A/,/B/' file.txt
awk: syntax error near line 1
awk: bailing out near line 1

file.txt

[ 2012/04/18 21:49:01:857 ] Monitor::handle_client_message(): 
[ 2012/04/18 21:50:02:379 ] Monitor::handle_client_message(
[ 2012/04/18 21:57:52:64  ] Monitor::handle_client_message():
[ 2012/04/18 21:57:52:252 ] Monitor::handle_client_message(
[ 2012/04/18 21:58:46:958 ] Monitor::handle_client_message():

[ 2012/04/19 21:58:46:958 ] Monitor::handle_client_message(): 
[ 2012/04/20 21:58:46:958 ] Monitor::handle_client_message(): 
[ 2012/04/21 21:58:46:958 ] Monitor::handle_client_message(): 
[ 2012/04/22 21:58:46:958 ] Monitor::handle_client_message():

Ниже приводится верный способ делать то, что хочешь.

Вы не хотите заранее избегать шаблонов поиска, и вам следует использовать -v вариант, как вы указываете в своем вопросе (но переменные оболочки должны быть указаны в кавычках).

Когда у вас есть шаблоны в переменных, вы не можете использовать // чтобы окружить шаблоны - вы должны использовать оператор соответствия ~ (тильда).

Это правильно работает с вашими данными:

a='2012/04/19'
b='2012/04/22'
awk -v A="$a" -v B="$b" '$0 ~ A, $0 ~ B' file.txt

Причина, по которой вы не можете помещать переменные внутрь // заключается в том, что символы в имени переменной рассматриваются как образец, а не как содержимое переменной.

Вы можете использовать эту команду:

$ awk '/2012\/04\/19/,/2012\/04\/22/' file.txt

Вам нужно избежать косой черты, как показано.

Редактировать:

Это можно сделать с помощью таких переменных, как:

$ a='2012\/04\/19'
$ b='2012\/04\/22'
$ awk "/$a/,/$b/" file.txt
[ 2012/04/19 21:58:46:958 ] Monitor::handle_client_message(): 
[ 2012/04/20 21:58:46:958 ] Monitor::handle_client_message(): 
[ 2012/04/21 21:58:46:958 ] Monitor::handle_client_message(): 
[ 2012/04/22 21:58:46:958 ] Monitor::handle_client_message():

Edit2:

Чтобы избежать косой черты, можно использовать done sed команда вроде:

$ a='2012/04/19'
$ aa=$(echo $a | sed 's/\//\\\//g')
$ echo $aa
2012\/04\/19

Тогда ты можешь aa вместо того a. Аналогично это можно сделать для b.