Tendo o seguinte em uma das minhas funções shell:
function _process () {
awk -v l="$line" '
BEGIN {p=0}
/'"$1"'/ {p=1}
END{ if(p) print l >> "outfile.txt" }
'
}
, portanto, quando chamado como _process $arg
, $arg
é passado como $1
e usado como padrão de pesquisa. Funciona assim, porque o shell se expande $1
no lugar do padrão awk! Também l
pode ser usado dentro do programa awk, sendo declarado com -v l="$line"
. Tudo bem.
É possível, da mesma maneira, fornecer um padrão para pesquisar como uma variável?
A seguir não funcionará,
awk -v l="$line" -v search="$pattern" '
BEGIN {p=0}
/search/ {p=1}
END{ if(p) print l >> "outfile.txt" }
'
, como awk não interpretará /search/
como uma variável, mas literalmente.
if (p) ...
$0 ~ pattern
, e ele não funciona, no entanto, com/'"$1"'/
ele funciona !? : O$line
é recuperada, a pesquisa de padrões é feita na saída dewhois $line
,$line
vindo do arquivo em um bloco WHILE DO.$line
- faça-o na sua pergunta para obter a formatação correta.Tem um problema que
awk
expande as seqüências de escape ANSI C (como\n
para nova linha,\f
feed de formulário,\\
barra invertida e assim por diante) em$1
. Portanto, torna-se um problema se$1
contiver caracteres de barra invertida que são comuns em expressões regulares (no GNUawk
4.2 ou superior, valores que começam com@/
e terminam/
também são um problema ). Outra abordagem que não sofre com esse problema é escrevê-lo:O quão ruim será depende da
awk
implementação.Todos
awk
s funcionam da mesma maneira para seqüências de escape válidas:(conteúdo do
$a
passado como está)(
\\
alterado para\
e\b
alterado para um caractere de backspace).fonte
\d{3}
encontrar três dígitos, isso não funcionaria como o esperado, se eu o entendesse bem?\d
qual não é uma sequência de escape C válida, que depende da suaawk
implementação (executeawk -v 'a=\d{3}' 'BEGIN{print a}'
para verificar). Mas para\` or
\ b, yes definitely. (BTW, I don't know of any awk implementations that understands
\ d` significa um dígito).\d' treated as plain
d 'd {3}, então acho que teria um problema nesse caso?ENVIRON["PATTERN"]
àPATTERN
variável de ambiente. Se você quiser usar uma variável shell, precisará exportá-la primeiro (export variable
) ou usar aENV=VALUE awk '...ENVIRON["ENV"]'
sintaxe de passagem env-var, como na minha resposta.Tente algo como:
fonte
/regex/
em termos de encontrar padrão, essa pode ser uma boa solução. Eu vou tentar.Não, mas você pode simplesmente interpolar o padrão na string de aspas duplas que passa para o awk:
Observe que agora você precisa escapar do literal awk entre aspas duplas, mas ainda é a maneira mais simples de fazer isso.
fonte
$pattern
contiver espaços, meu exemplo acima funcionará, pois $ 1 é protegido com aspas duplas "$ 1", mas não descarte o que acontece no seu caso.'
, depois protege as$1
aspas duplas e, em seguida, coloca outra sequência de aspas simples na segunda metade do programa awk. Se bem entendi, isso deve ter exatamente o mesmo efeito que proteger as$1
aspas simples externas - o awk nunca vê as aspas duplas que você coloca em torno dele.$pattern
contém^/ {system("rm -rf /")};
, então você está com um grande problema.Você pode usar a função eval, que resolve neste exemplo a variável nets antes da execução do awk.
fonte