wc -l file.txt
gibt die Anzahl der Zeilen und den Dateinamen aus.
Ich brauche nur die Nummer selbst (nicht den Dateinamen).
Ich kann dies tun
wc -l file.txt | awk '{print $1}'
Aber vielleicht gibt es einen besseren Weg?
wc -l file.txt
gibt die Anzahl der Zeilen und den Dateinamen aus.
Ich brauche nur die Nummer selbst (nicht den Dateinamen).
Ich kann dies tun
wc -l file.txt | awk '{print $1}'
Aber vielleicht gibt es einen besseren Weg?
Antworten:
Versuchen Sie Folgendes:
wc -l < file.txt
wc -l
sollte keine ausgeben, und warum sollte ksh der Standardausgabe eines Programms ein Leerzeichen voranstellen?
4711 [stdin]
die Ausgabe erwarten .
printf "%'d"
, wodurch der Platz geschont und große Zahlen schön ausgedruckt werden.
cat file.txt | wc -l
Laut Manpage (für die BSD-Version muss ich keine GNU-Version überprüfen):
Wenn keine Dateien angegeben sind, wird die Standardeingabe verwendet und kein Dateiname angezeigt. Die Eingabeaufforderung akzeptiert Eingaben bis zum Empfang von EOF oder [^ D] in den meisten Umgebungen.
wc -l < file.txt
hat den gleichen Effekt.
wc -l < file.txt
, um die nutzlose Verwendung von Katze zu vermeiden. Obwohl Sie absolut verrückt sind, wenn Sie denken, dass dies spürbare Zeit in Anspruch nimmt.
Um dies ohne den führenden Raum zu tun, warum nicht:
wc -l < file.txt | bc
wc -l < file.txt
, um den wc -l < file.txt | bc
Wie wäre es mit
wc -l file.txt | cut -d' ' -f1
dh die Ausgabe von wc
in cut
weiterleiten (wobei Trennzeichen Leerzeichen sind und nur das erste Feld auswählen)
wc -l file.txt | awk '{print $1}'
OP versucht hat.
wc -l < file.txt
Methode. Muss aber | cut -d' ' -f2
auf BSD verwendet werden, solange der wc
Befehl ein führendes Leerzeichen zurückgibt, Beispiel: "34068289 file.txt" anstelle von "34068289 file.txt".
Ich hatte ein ähnliches Problem beim Versuch, eine Zeichenanzahl ohne das von bereitgestellte führende Leerzeichen zu erhalten wc
, was mich zu dieser Seite führte. Nachdem ich die Antworten hier ausprobiert habe, sind die folgenden Ergebnisse meiner persönlichen Tests auf einem Mac (BSD Bash). Auch dies ist für die Anzahl der Zeichen; für die Zeilenanzahl würden Sie tun wc -l
. echo -n
lässt den Zeilenumbruch weg.
FOO="bar"
echo -n "$FOO" | wc -c # " 3" (x)
echo -n "$FOO" | wc -c | bc # "3" (√)
echo -n "$FOO" | wc -c | tr -d ' ' # "3" (√)
echo -n "$FOO" | wc -c | awk '{print $1}' # "3" (√)
echo -n "$FOO" | wc -c | cut -d ' ' -f1 # "" for -f < 8 (x)
echo -n "$FOO" | wc -c | cut -d ' ' -f8 # "3" (√)
echo -n "$FOO" | wc -c | perl -pe 's/^\s+//' # "3" (√)
echo -n "$FOO" | wc -c | grep -ch '^' # "1" (x)
echo $( printf '%s' "$FOO" | wc -c ) # "3" (√)
Ich würde mich cut -f*
im Allgemeinen nicht auf die Methode verlassen, da Sie die genaue Anzahl der führenden Leerzeichen für eine bestimmte Ausgabe kennen müssen. Und der grep
eine dient zum Zählen von Zeilen, aber nicht von Zeichen.
bc
ist am prägnantesten awk
und perl
scheint ein bisschen übertrieben, aber sie sollten alle relativ schnell und tragbar genug sein.
Beachten Sie auch, dass einige davon angepasst werden können, um umgebende Leerzeichen auch von allgemeinen Zeichenfolgen zu trennen (zusammen mit echo `echo $FOO`
einem weiteren netten Trick).
echo $(printf '%s' "$FOO" | wc -c)
ist eine der seltenen echo
Situationen, in denen mit einem Befehl Subshitution nicht nutzlos ist.
echo `echo $FOO`;
auch wie ein String.trim () -Befehl für eine Variable! Das ist unglaublich praktisch. Ich werde auch Ihre Zeile zu meiner Antwort hinzufügen.
printf
besser als echo
?
Offensichtlich gibt es dafür viele Lösungen. Hier ist noch eine:
wc -l somefile | tr -d "[:alpha:][:blank:][:punct:]"
Dies gibt nur die Anzahl der Zeilen aus, aber das nachfolgende Zeilenumbruchzeichen ( \n
) ist vorhanden. Wenn Sie dies auch nicht möchten, ersetzen Sie es [:blank:]
durch [:space:]
.
test9
mit 1 Zeile wird die Ausgabe 19 sein.
Der beste Weg wäre, zuerst alle Dateien im Verzeichnis zu finden und dann AWK NR (Number of Records Variable) zu verwenden.
unten ist der Befehl:
find <directory path> -type f | awk 'END{print NR}'
Beispiel: - find /tmp/ -type f | awk 'END{print NR}'
wc -l < file.txt
erledigt die Arbeit präzise und präzise.