пожалуйста, посоветуйте, что не так с моим синтаксисом 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
.