Ich versuche meine Protokolle zu sortieren und habe festgestellt, dass einstellige Daten falsch geschnitten wurden. Jetzt möchte ich Fügen Sie entweder eine 0 hinzu oder entfernen Sie das zusätzliche Leerzeichen.
Vorher wollte ich sehen, wie ich die richtigen Zeilen erhalte, die ich bearbeiten möchte.
Ein Ende der letzten 3 Zeilen:
$tail -3 testlog Wed Feb 7 23:30:59 2018 daemon.info hostapd: wlan0: STA de:ad:be:ef:c0:fe WPA: group key handshake completed (RSN) Wed Feb 7 23:40:59 2018 daemon.info hostapd: wlan0: STA de:ad:be:ef:c0:fe WPA: group key handshake completed (RSN) Wed Feb 7 23:50:59 2018 daemon.info hostapd: wlan0: STA de:ad:be:ef:c0:fe WPA: group key handshake completed (RSN)
Nachdem ich mich nun an das Skript gewöhnt hatte, schrieb ich dies in der Erwartung, dasselbe Ergebnis zu erzielen:
$ while read line; do if [ $(echo $line|cut -c7) == "b" ]; then echo $line; fi; done < testlog | tail -3 Wed Feb 7 23:30:59 2018 daemon.info hostapd: wlan0: STA de:ad:be:ef:c0:fe WPA: group key handshake completed (RSN) Wed Feb 7 23:40:59 2018 daemon.info hostapd: wlan0: STA de:ad:be:ef:c0:fe WPA: group key handshake completed (RSN) Wed Feb 7 23:50:59 2018 daemon.info hostapd: wlan0: STA de:ad:be:ef:c0:fe WPA: group key handshake completed (RSN)
Aber damit wird der zusätzliche Speicherplatz vor der 7 entfernt. Ich habe nicht damit gerechnet. Ich schneide ihn nicht mit meinem Skript, oder?
Vielen Dank im Voraus!
Kommentare
- Was ist Wortteilung? Warum ist es bei der Shell-Programmierung wichtig? und BashGuide: Wortaufteilung
- Oder vielleicht sollten wir dies einfach als markieren Duplikat von Warum verschluckt sich mein Shell-Skript an Leerzeichen oder anderen Sonderzeichen?
- großartiger Link @ilkkachu
Antwort
Sie würden dasselbe für alle anderen doppelten (oder mehr) Leerzeichen bemerken. Auf nicht zitierte Variablenerweiterungen folgt die Wortaufteilung . Sobald die Wörter durch Leerzeichen (IFS) aufgeteilt sind, werden sie mit einem Leerzeichen dazwischen wieder zusammengesetzt.
Eine Problemumgehung kann sein :
Die Shell scannt die Ergebnisse der Parametererweiterung, Befehlssubstitution und arithmetischen Erweiterung , die dies nicht getan haben treten in doppelten Anführungszeichen für die Wortaufteilung auf.
Ein konkretes Beispiel finden Sie unter:
$ line="Wed Feb 7 23:30:59" $ echo $line Wed Feb 7 23:30:59
versus:
$ line="Wed Feb 7 23:30:59" $ echo "$line" Wed Feb 7 23:30:59
Es lohnt sich zu lesen: Warum verschluckt sich mein Shell-Skript an Leerzeichen oder anderen Sonderzeichen?
Kommentare
- Beispiel:
var='1 1'
(mit vielen Leerzeichen verschwinden sie im Markup hier) gefolgt vonecho $var
undecho "$var"
. - Eigentlich ein ausgezeichneter Punkt; ' ist das nicht zitierte Echo, das ' die Leerzeichen verliert.
- sehr klar! danke @JeffSchaller und kusalananda