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
- Co to jest podział na słowa? Dlaczego jest to ważne w programowaniu powłoki? i BashGuide: dzielenie słów
- A może powinniśmy po prostu oznaczyć to jako duplikat Dlaczego mój skrypt powłoki dławi się białymi znakami lub innymi znakami specjalnymi?
- świetny link @ilkkachu
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ępnieecho $var
iecho "$var"
. - Właściwie to doskonała uwaga; to ' to niecytowane echo, które ' traci spacje.
- bardzo jasne! dzięki @JeffSchaller i kusalananda