awk zitiert Programmtext

awk zitiert Programmtext

Ich bin gerade auf ein Problem in awk gestoßen und wüsste gern, ob mir jemand erklären kann, warum das passiert.

Die folgenden beiden Zeilen verhalten sich unterschiedlich, wenn ich Folgendes ausführe:

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

Ich erhalte (wie erwartet) nur das erste Verzeichnis des Pfads zu Dateien, die BASE_DIR enthalten.

Wenn ich es jedoch so ausführe:

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

BEARBEITEN:

-F="/"und -F "/"macht bei meinen Tests keinen Unterschied. Der zweite Befehl wurde aktualisiert, um dies anzuzeigen

wie von Glenn Jackman in der Antwort vorgeschlagen, habe ich den Befehl wie folgt geändert:

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

und bekam genau das gleiche fehlerhafte Ergebnis

Ende von EDIT

Ich erhalte den vollständigen Pfad zu Dateien, die BASE_DIR enthalten. Ich habe versucht, den Programmtext zu maskieren, damit dies "{print \$1}"der Fall wäre, falls dies das Problem wäre, aber ich habe die gleichen Ergebnisse erhalten.

Kann mich jemand darüber aufklären, wo hier das Problem liegt?

Antwort1

Im ersten Beispiel tun Sie: awk -F "/"
Im nächsten Beispiel tun Sie:awk -F="/"

Der Feldtrenner ist also anders: Sie verwenden die zweistellige Zeichenfolge =/als Feldtrenner


Ah, ich weiß nicht, warum ich das nicht vorher gesehen habe: Sie verwenden die falschen Anführungszeichen:

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

Die Anführungszeichen um das awk-Programm bedeuten, dass die Shell die Variable ersetzt$1 VorÜbergabe des Programms an awk. In der Shell ist es höchstwahrscheinlich $1leer, sodass awk Folgendes sieht:{print }

Verwenden Sie stattdessen einfache Anführungszeichen.

verwandte Informationen