awk citando o texto do programa

awk citando o texto do programa

Acabei de me deparar com uma pegadinha no awk e gostaria de saber se alguém pode me explicar por que isso acontece.

As duas linhas a seguir se comportam de maneira diferente se eu executar:

# grep -Rl BASE_DIR --exclude-dir=.svn * | awk -F "/" '{print $1}'

Recebo (como esperado) apenas o primeiro diretório do caminho para os arquivos que contêm BASE_DIR.

No entanto, se eu executar assim:

# grep -Rl BASE_DIR --exclude-dir=.svn * | awk -F="/" "{print $1}"

EDITAR:

-F="/"e -F "/"não faça diferença nos meus testes. o segundo comando foi atualizado para mostrar isso

conforme sugerido por Glenn Jackman na resposta, mudei o comando para:

# grep -Rl BASE_DIR --exclude-dir=.svn * | awk -F "/" "{print $1}"

e obtive exatamente o mesmo resultado falho

Fim da EDIÇÃO

Recebo o caminho completo para os arquivos que contêm BASE_DIR, tentei escapar do texto do programa para que fosse esse "{print \$1}"o problema, mas obtive os mesmos resultados.

Alguém pode me esclarecer qual é o problema aqui?

Responder1

No primeiro exemplo, você está fazendo: awk -F "/"
No próximo exemplo, você está fazendo:awk -F="/"

Portanto, o separador de campos é diferente: você está usando a sequência de dois caracteres =/como separador de campos


Ah, não sei por que não vi isso antes: você está usando aspas erradas:

# grep -Rl BASE_DIR --exclude-dir=.svn * | awk -F "/" "{print $1}"
------------------------------------------------------^

As aspas duplas ao redor do programa awk significam que o shell substituirá a variável$1 antesentregando o programa para o awk. Provavelmente, no shell, $1está vazio, então awk vê isto:{print }

Use aspas simples.

informação relacionada