awk citando el texto del programa

awk citando el texto del programa

Me acabo de encontrar con un problema en awk y me gustaría saber si alguien puede explicarme por qué sucede esto.

Las siguientes 2 líneas se comportan de manera diferente si ejecuto:

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

Obtengo (como se esperaba) solo el primer directorio de la ruta a los archivos que contienen BASE_DIR.

Sin embargo, si lo ejecuto así:

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

EDITAR:

-F="/"y -F "/"no hagas ninguna diferencia en mis pruebas. el segundo comando se ha actualizado para mostrar esto

Como lo sugirió Glenn Jackman en la respuesta, cambié el comando a:

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

y obtuve exactamente el mismo resultado defectuoso

Fin de EDITAR

Obtengo la ruta completa a los archivos que contienen BASE_DIR, intenté escapar del texto del programa para que estuviera "{print \$1}"en caso de que este fuera el problema, pero obtuve los mismos resultados.

¿Alguien puede aclararme cuál es el problema aquí?

Respuesta1

En el primer ejemplo, estás haciendo: awk -F "/"
En el siguiente ejemplo, estás haciendo:awk -F="/"

Entonces, el separador de campo es diferente: estás usando la cadena de dos caracteres =/como separador de campo.


Ah, no sé por qué no vi esto antes: estás usando comillas incorrectas:

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

Las comillas dobles alrededor del programa awk significan que el shell sustituirá la variable$1 antesentregando el programa a awk. Lo más probable es que el shell $1esté vacío, por lo que awk ve esto:{print }

Utilice comillas simples en su lugar.

información relacionada