Regex inversa no AWK?

Regex inversa no AWK?

Estou tentando filtrar as linhas que contêm uma palavra específica. O regex é a entrada da linha de comando para o script.

$0 ~ regex {
//Do something.
}

A entrada de amostra é:

**String** **number**
domain  1
domain  2
bla     3

Portanto, a partir da entrada acima, o usuário pode dizer - filtrar as linhas que possuem a palavra "domínio".

O que eu tentei:

regex = "\?\\!domain" 

(antecipação negativa).

Mas esse regex está filtrando todas as linhas. Não apenas as linhas com a palavra "domínio".

Responder1

Para determinado arquivo de entrada inputcontendo o seguinte:

domain
demesne

Para filtrar linhas contendo domain:

$ awk '/domain/ { print }' input
domain

Para filtrar linhasnãocontendo domain:

$ awk '!/domain/ {print }' input
demesne

Para filtragem com base nocampoem vez da linha inteira, podemos tentar o seguinte para o novo inputarquivo fornecido:

example www.example.com
exemplar www.example.net

Para filtrar linhas onde o primeiro campocontém example:

$ awk '$1 !~ /example/ { print }' input
exemplar www.example.net

Na sua pergunta, você usou $0qual é a linha inteira em vez do primeiro campo.

Responder2

Outra maneira mais flexível/poderosa de filtrar linhas é com {next}:

  • Para imprimir todas as linhas quenãocorresponder a um dado regex, faça:
    awk '/regex/ {next} {print}' inputfile
    

Você pode até filtrar todas as linhas entre duas linhas específicas com este método, da seguinte maneira:

  • Para imprimir todas as linhas quenão sãoentre uma correspondência de linha regex1e a primeira correspondência de linha seguinte regex2, faça:

    awk '/regex1/,/regex2/ {next} {print}' inputfile
    

    o que não é possível com o awk '!/regex/'método (se não me engano).

Por exemplo, se inputfileo conteúdo do seu for este:

hello, here is my confidential information

SECRET INFO BEGIN
xx
x
xxxxx
xxxx
xxxx
xxxxx
xs
sdf
sdfsdfw
wefwe
SECRET INFO END

This is the end of my message

Então, este comando awk '/SECRET INFO BEGIN/,/SECRET INFO END/ {next} {print}' inputfileimprimiria:

hello, here is my confidential information


This is the end of my message

Responder3

echo 'hello, here is my confidential information

SECRET INFO BEGIN
xx
x
xxxxx
xxxx
xxxx
xxxxx
xs
sdf
sdfsdfw
wefwe
SECRET INFO END

This is the end of my message' |  

 mawk 'BEGIN { _^= FS = RS } ! /SECRET INFO/ ? _ : _ * (_=!_)'

 gawk 'BEGIN { _^= FS = "SECRET INFO" } _*(NF <= _^_ || _=!_)'

hello, here is my confidential information


This is the end of my message

informação relacionada