awk + perl + pega dois argumentos para sintaxe do awk

2

por favor, avise o que há de errado com a minha sintaxe awk e como corrigi-la (esta sintaxe está no meu script ksh) e executo meu script na máquina linux

minha meta é obter do arquivo.txt apenas as linhas que estão entre as datas:

DE 2012-04-19 PARA 2012-04-22

remark - outra solução pode ser com 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

arquivo.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():
    
por yael 19.04.2012 / 09:35

2 respostas

2

Você pode usar este comando:

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

Você precisa escapar das barras conforme mostrado.

Editar:

Isso pode ser feito usando variáveis como:

$ 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:

Escapar das barras pode ser feito usando o comando sed como:

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

Em seguida, você pode aa em vez de a . Da mesma forma, isso pode ser feito para b .

    
por 19.04.2012 / 09:43
2

O seguinte é a maneira correta de fazer o que você quer.

Você não precisa ter que pré-escapar seus padrões de pesquisa e deve usar a opção -v como mostra na sua pergunta (mas as variáveis do shell devem ser citadas).

Quando você tem padrões em variáveis, você não pode usar // para cercar os padrões - você tem que usar o operador de correspondência ~ (til).

Isso funciona corretamente para seus dados:

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

O motivo pelo qual você não pode colocar variáveis dentro de // é que os caracteres no nome da variável são vistos como o padrão em vez do conteúdo da variável.

    
por 19.04.2012 / 13:11