Aqui, não acho que foi sua intenção tratar 2017-12-05T12:07:33.941Z
como um regexp (onde .
corresponderia a qualquer caractere em vez de apenas .
).
Para uma correspondência de substring, ao contrário de uma correspondência de expressão regular, você pode usar index()
:
LAST_LOG="$last_log" awk 'index($0, ENVIRON["LAST_LOG"]) {y=1;next};y' file.txt
Eu prefiro ENVIRON
over -v
como -v
manipula o conteúdo da variável se contiver barras invertidas ( como já foi observado no Q & A que você referenciou ).
Sobre o motivo da sua falha:
/{print last_log}/
como condição , corresponde a registros que correspondem à expressão regular {print last_log}
, mas essa não é uma expressão regular válida ( {
é um operador regexp que precisa ser usado como {2}
ou {1,5}
...).
Em:
/$0 ~ last_log/
novamente, que tenta corresponder em $0 ~ last_log
como um regexp. Aqui, isso significa que as linhas que contêm 0 ~ last_log
após o final da linha ( $
), nunca serão correspondidas. Você provavelmente quis dizer:
awk -v last_log="$last_log" '$0 ~ last_log {y=1;next};y' file.txt
É aí que a condição é a expressão $0 ~ last_log
, em oposição a apenas uma regexp /foo/
. /foo/
é a abreviação de $0 ~ /foo/
, que corresponde à foo
regexp do registro completo.
Você pode fazer $0 ~ var
, mas não pode fazer var
sozinho, pois não seria uma correspondência de expressão regular, mas uma expressão que será resolvida como verdadeira se var
contiver um número diferente de 0 ou uma string não numérica não vazia (como para o seu y
one)