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 -lsollte 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.txthat 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 wcin cutweiterleiten (wobei Trennzeichen Leerzeichen sind und nur das erste Feld auswählen)
wc -l file.txt | awk '{print $1}'OP versucht hat.
wc -l < file.txtMethode. Muss aber | cut -d' ' -f2auf BSD verwendet werden, solange der wcBefehl 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 -nlä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 grepeine dient zum Zählen von Zeilen, aber nicht von Zeichen.
bcist am prägnantesten awkund perlscheint 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 echoSituationen, 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.
printfbesser 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:].
test9mit 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.txterledigt die Arbeit präzise und präzise.