Snažím se třídit své protokoly a zjistil jsem, že jednociferná data byla zkrácena nesprávně. Teď chci buď přidat 0, nebo odstranit mezeru.
Před tím jsem chtěl zjistit, jak získat správné řádky, které chci upravit.
Ocas posledních 3 řádků:
$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)
Nyní, když jsem se dostal ke skriptu, napsal jsem toto a očekával stejný výsledek:
$ 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 s tím se odstraní prostor navíc před sedmičkou. Nečekal jsem, že se to stane. Neřeším to svým skriptem, že?
Díky předem!
Komentáře
- Co je rozdělení slov? Proč je to důležité v programování prostředí? a BashGuide: Word Splitting
- Nebo bychom to měli označit jako duplikát Proč se můj skript škrtí mezerami nebo jinými speciálními znaky?
- skvělý odkaz @ilkkachu
Odpověď
To samé byste si mohli všimnout i pro všechny další zdvojené (nebo více) mezery. Po neoznačených expanzích proměnných následuje rozdělení slov , takže jakmile jsou slova rozdělena mezerami (IFS), jsou znovu sestavena s jednou mezerou mezi nimi.
Může být jedno řešení :
Prostředí prohledá výsledky rozšíření parametrů, nahrazení příkazů a aritmetické expanze , které ne vyskytují se v uvozovkách pro rozdělení slov.
Konkrétní příklad:
$ 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
Stojí za přečtení: Proč se můj skript škrtí mezerami nebo jinými speciálními znaky?
Komentáře
- Příklad:
var='1 1'
(s mnoha mezerami zmizí ve značce zde) následovanéecho $var
aecho "$var"
. - Vlastně vynikajícím bodem; ' s necitovanou ozvěnou, která ' ztrácí mezery.
- velmi jasné! děkuji @JeffSchaller a kusalananda