tail und bash: unterschiedliche Ausgabe, wenn dasselbe erwartet wird

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

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 von echo $var und echo "$var".
  • Eigentlich ein ausgezeichneter Punkt; ' ist das nicht zitierte Echo, das ' die Leerzeichen verliert.
  • sehr klar! danke @JeffSchaller und kusalananda

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.