awk citando texto do programa

3

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

As seguintes 2 linhas se comportam de maneira diferente quando eu executo:

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

Eu recebo (como esperado) apenas o primeiro diretório do caminho para arquivos contendo 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 fazem diferença nos meus testes. o segundo comando foi atualizado para mostrar isso

como sugerido por glenn jackman na resposta Alterei o comando para:

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

e obteve o mesmo resultado incorreto

Fim da EDIT

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

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

    
por rantsh 27.03.2013 / 16:56

1 resposta

2

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

Portanto, o separador de campo é diferente: você está usando a string de dois caracteres =/ como o separador de campo

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 em torno do programa awk significam que o shell substituirá a variável $1 antes de entregar o programa ao awk. Provavelmente, no shell, $1 está vazio, então o awk vê isto: {print }

Use aspas simples em vez disso.

    
por glenn jackman 27.03.2013 / 17:05