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, $1
está vazio, então awk vê isto:{print }
Use aspas simples.