Passando variáveis para padrões de intervalo no awk

2

Estou tentando usar padrões de intervalo no awk:

grep -a volume somefile | awk '/^Apr 25 23:44:04*/,/^Apr 26 12:44:01*/ {print}'

Isso funciona bem, mas quando tento executá-lo colocando a data e a hora em variáveis e executá-las, parece não funcionar:

time1="Apr 25 23:44:04"
time2="Apr 26 12:44:01"
grep -a volume somefile | awk '/^"$time1"*/,/^"$time2"*/ {print}'
    
por riya 01.05.2015 / 07:13

1 resposta

2

Como as variáveis do shell dentro de uma string entre aspas simples, elas não serão expandidas. Não importa que a string entre aspas simples inclua aspas duplas dentro dela, ainda é uma string entre aspas simples.

Use em vez disso:

grep -a volume somefile | awk "/^$time1/,/^$time2/ {print}"

Na verdade, como print é a ação padrão , é possível simplificar isso para:

grep -a volume somefile | awk "/^$time1/,/^$time2/"

Você precisa ter cuidado com essa abordagem. Você deve certificar-se de que nem time1 nem time2 contenham caracteres ativas não intencionais.

Uma abordagem mais segura é transferir as variáveis do shell para variáveis awk:

grep -a volume somefile | awk -v t1="$time1" -v t2="$time2" '($0~"^"t1),($0~"^"t2)'

Observe que, mesmo nessa abordagem mais segura, como observa Gilles nos comentários, você ainda deve tomar cuidado: se as strings em time1 e time2 contiverem os caracteres ^*+.?\[|{$ , as strings serão interpretadas como expressões regulares. Isso não é um problema para as strings mostradas na pergunta (elas não contêm caracteres regex-ativos), mas, se outras strings lhe dessem resultados surpreendentes, esta é uma causa provável.

    
por 01.05.2015 / 07:29