Ich habe die folgenden drei Konstrukte in einem Bash-Skript:
NUMOFLINES=$(wc -l $JAVA_TAGS_FILE)
echo $NUMOFLINES" lines"
echo $(wc -l $JAVA_TAGS_FILE)" lines"
echo "$(wc -l $JAVA_TAGS_FILE) lines"
Und beide erzeugen identische Ausgabe, wenn das Skript ausgeführt wird:
121711 /home/slash/.java_base.tag lines
121711 /home/slash/.java_base.tag lines
121711 /home/slash/.java_base.tag lines
Dh der Name der Datei wird ebenfalls wiedergegeben (was ich nicht möchte). Warum schlagen diese Scriplets fehl und wie soll ich ein Clean ausgeben:
121711 lines
?
Antworten:
Ein Beispiel mit Ihren eigenen Daten
Sie können vermeiden, dass Ihr Dateiname in die Variable NUMOFLINES eingebettet wird , indem Sie die Umleitung von JAVA_TAGS_FILE verwenden , anstatt den Dateinamen als Argument an wc zu übergeben . Zum Beispiel:
NUMOFLINES=$(wc -l < "$JAVA_TAGS_FILE")
Erläuterung: Verwenden Sie Pipes oder Umleitung, um Dateinamen in der Ausgabe zu vermeiden
Das Dienstprogramm wc druckt den Namen der Datei in seiner Ausgabe nicht, wenn die Eingabe von einem Pipe- oder Umleitungsoperator stammt. Betrachten Sie diese verschiedenen Beispiele:
# wc shows filename when the file is an argument $ wc -l /etc/passwd 41 /etc/passwd # filename is ignored when piped in on standard input $ cat /etc/passwd | wc -l 41 # unusual redirection, but wc still ignores the filename $ < /etc/passwd wc -l 41 # typical redirection, taking standard input from a file $ wc -l < /etc/passwd 41
Wie Sie sehen können, druckt wc den Dateinamen nur, wenn er als Argument und nicht als Daten für die Standardeingabe übergeben wird. In einigen Fällen möchten Sie möglicherweise, dass der Dateiname gedruckt wird. Daher ist es hilfreich zu verstehen, wann er angezeigt wird.
quelle
wc
Ich kann den Dateinamen nicht erhalten, wenn Sie ihm keinen geben.wc -l < "$JAVA_TAGS_FILE"
quelle
wc
stdin, wie in der Antwort gezeigt. Alsocat "$JAVA_TAGS_FILE" | wc -l
oder gleichwertigwc -l < "$JAVA_TAGS_FILE"
. Auf diese Weise werdenwc
nur Rohdaten abgerufen, nicht der Dateiname.Sie können auch awk verwenden:
awk 'END {print NR,"lines"}' filename
Oder
awk 'END {print NR}' filename
quelle
(auf Mac und wahrscheinlich auch auf anderen Unixen anwenden)
Tatsächlich gibt es ein Problem mit dem wc-Ansatz: Er zählt nicht die letzte Zeile, wenn er nicht mit dem Zeilenende-Symbol endet.
Verwenden Sie dies stattdessen
oder noch besser (danke gniourf_gniourf):
nblines=$(grep -c '' file.txt)
Hinweis: Der awk-Ansatz von chilicuil funktioniert ebenfalls.
quelle
nblines=$(grep -c '' file)
stattdessen (was in diesem Fall die kanonische Methode ist, unvollständige Zeilen zu zählen). Beachten Sie jedoch, dass Sie laut POSIX die unvollständigen Zeilen (und nicht die Zeilen ) zählen. Sie haben es tatsächlich mit einer Binärdatei und nicht mit einer Textdatei zu tun .nblines=$(($(cat "file.txt" | wc -l) + 1))
Es ist sehr einfach:
NUMOFLINES=$(cat $JAVA_TAGS_FILE | wc -l )
oder
NUMOFLINES=$(wc -l $JAVA_TAGS_FILE | awk '{print $1}')
quelle
cat
, hätten Sie das 2. Beispiel, weil eswc -l
2 Spalten zurückgibt, wenn es nur mit einer Datei verwendet wird.Normalerweise benutze ich die 'Back Tick'-Funktion von Bash
export NUM_LINES=`wc -l filename`
Beachten Sie, dass das 'Häkchen' das 'Zurück-Häkchen' ist, z. B. 'nicht das normale einfache Anführungszeichen
quelle