Linux-Shell wc -c Anzahl Zeichen +1

17

Ich habe den Befehl wc -c verwendet, um die Anzahl der Zeichen zu zählen, aber es gibt mir eine falsche Anzahl, Anzahl der Zeichen plus eins als Beispiel:

echo "k" | wc -c 

Es gibt mir 2 Zeichen

also warum nicht 1?

Mohammad Karmi
quelle
3
Die -cOption ist eine
Byteanzahl
1
-m, --chars drucken die Anzahl der Zeichen Ich habe das gleiche Problem auch verwendet
Mohammad Karmi
Sie haben Recht, ich dachte, Unicode wäre zwei Bytes pro Zeichen, aber es scheint, dass ASCII-Buchstaben in Uni immer noch 1 Byte sind. Neugierig. Ich denke, EOL
Mcalex
1
Ja, ich habe "k" in eine Datei eingegeben und es werden 2 Zeichen angezeigt, die ich entfernt habe, daher werden 0 Neugierige
angezeigt

Antworten:

19

Schauen Sie sich die Hilfemeldung für an wc. Die -cOption gibt die Anzahl der Zeichen aus. Der echoBefehl enthält standardmäßig ein Zeilenumbruchzeichen. Wenn wcdie Zeilenvorschubzeile angezeigt wird, zählt sie als ein anderes Zeichen und daher als zusätzliche Anzahl in Ihrem Ergebnis. Sie können dies umgehen, indem Sie eine der unten gezeigten Alternativen verwenden. -wzählt die Anzahl der Wörter und -lzählt die Anzahl der Zeilen.

echo "k" | wc -w 
echo "k" | wc -l

Sie können die Ausgabe von wcto awkleiten, um die Anzahl der Zeichen abzurufen, mit Ausnahme der Zeilenvorschubzeichen:

wc <filename> | awk '{print $3-$1}'

Die Standardausgabe von wcohne Optionen gibt die Anzahl der Zeilenumbrüche ($ 1 bis awk), die Anzahl der Wörter und die Anzahl der Zeichen ($ 3 bis awk) in dieser Reihenfolge aus.

dinesh
quelle
ok, es gibt also ein wort und eine
zeile
Ich möchte die Anzahl der Zeichen nicht Wörter oder Zeilen zählen
Mohammad Karmi
5
ahhh, du meinst also echo -n "k" | wc -c. Das macht Sinn
mcalex
Ich habe das Zeichen in die Datei gelegt und es gibt damit die EOF gezählt? oder neue Zeile oder was ?, Da ich mehr als ein Zeichen zählen möchte
Mohammad Karmi
1
@ user1865719: printfwird oft vorgezogen, echowenn Konsistenz wichtig ist. Es ist nicht eine neue Zeile gedruckt werden, es sei denn ausdrücklich darum gebeten, so printf "k" | wc -mgibt 1, dh die Anzahl der Zeichen gedruckt. Um Zeichen in der ersten Zeile einer Datei zu zählen, kann man tun , zB $(($(head -1 file | wc -m)-1))(wickeln Sie es in $(())Hülle Arithmetik zu tun , um die Newline - Zählung zu entfernen) oder noch besser: Verwendung awk und tut awk 'NR==1{print length}' file.
Daniel Andersson
12

Wenn Sie dies tun, hängt echo "k"der echoBefehl ein Zeilenumbruchzeichen an das, was Sie zum Ausdrucken aufgefordert haben ("k"). Sie können die -nOption verwenden, um dies zu deaktivieren:

echo -n k | wc -c
1

Für diese Betrachtung unsichtbaren Zeichen, könnten Sie Dump - Stream WHITH ododer hd:

echo k | od -t c
0000000   k  \n

echo k | hd
00000000  6b 0a                                             |k.|

echo k | od -t a -A n
   k  nl
F. Hauri
quelle
6

Dies liegt daran, dass Sie Echo verwenden (das einen Wagenrücklauf hat), und stattdessen printf verwenden:

$ echo k | wc -c 2

$ printf k | wc -c 1
Nick
quelle