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 $1
esté vacío, por lo que awk ve esto:{print }
Utilice comillas simples en su lugar.