tail i bash: inne dane wyjściowe, gdy oczekiwano tego samego

Próbuję posortować dzienniki i stwierdziłem, że jednocyfrowe daty zostały nieprawidłowo przycięte. Teraz chcę dodaj 0 lub usuń dodatkową spację.
Wcześniej chciałem zobaczyć, jak uzyskać prawidłowe wiersze, które chcę edytować.

Koniec ostatnich 3 wierszy:

$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) 

Przechodząc do skryptu, napisałem ten tekst spodziewając się tego samego wyniku:

$ 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) 

Ale dzięki temu dodatkowa spacja przed usunięciem siódemki zostanie usunięta. Nie spodziewałem się, że tak się stanie. Nie skracam tego swoim skryptem, prawda?

Z góry dziękuję!

Komentarze

Odpowiedź

Można zauważyć, że to samo dotyczy innych podwójnych (lub więcej) spacji. Po rozwinięciu zmiennych bez cudzysłowów następuje podział na słowa , więc po podzieleniu słów na spacje (IFS) są one składane ponownie z jedną spacją między nimi.

Jednym obejściem może być :

Powłoka skanuje wyniki interpretacji parametrów, podstawiania poleceń i interpretacji wyrażeń arytmetycznych , które nie występują w cudzysłowach w celu podziału na słowa.

Jako konkretny przykład zobacz:

$ line="Wed Feb 7 23:30:59" $ echo $line Wed Feb 7 23:30:59 

kontra:

$ line="Wed Feb 7 23:30:59" $ echo "$line" Wed Feb 7 23:30:59 

Warto przeczytać: Dlaczego mój skrypt powłoki dławi się spacjami lub innymi znakami specjalnymi?

Komentarze

  • Przykład: var='1 1' (z wieloma spacjami znikają ze znacznika tutaj), a następnie echo $var i echo "$var".
  • Właściwie to doskonała uwaga; to ' to niecytowane echo, które ' traci spacje.
  • bardzo jasne! dzięki @JeffSchaller i kusalananda

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *