Yritän lajitella lokini ja huomasin, että yksinumeroiset päivämäärät leikattiin väärin. Nyt haluan joko lisää 0 tai poista ylimääräinen tila.
Ennen sitä halusin nähdä, kuinka saan oikeat muokattavat rivit.
Kolmen viimeisen rivin häntä:
$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)
Työskentelyni komentosarjan parissa kirjoitin tämän odottaen saavan saman tuloksen:
$ 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)
Mutta tällöin ylimääräinen tila ennen 7: ää poistetaan. En odottanut tämän tapahtuvan. En leikkaa sitä skriptilläni, vai mitä?
Kiitos jo etukäteen!
Kommentit
- Mikä on sanan jakaminen? Miksi se on tärkeä shell-ohjelmoinnissa? ja BashGuide: Sanan jakaminen
- Tai ehkä meidän pitäisi vain merkitä tämä kopio Miksi komentosarjan komentosarjani tukahduttaa välilyönnin tai muita erikoismerkkejä?
- loistava linkki @ilkkachu
vastaus
Huomaa saman muillekin kaksinkertaistetuille (tai useammille) välilyönneille. Noteeraamattomien muuttujien laajennusten jälkeen seuraa sanojen jakaminen , joten kun sanat on jaettu välilyönneillä (IFS), ne kootaan uudelleen siten, että yksi väli on niiden välissä.
Yksi kiertotapa voi olla :
Kuori skannaa parametrien laajennuksen, komentojen korvaamisen ja aritmeettisen laajennuksen tulokset , jotka eivät esiintyä kaksoislainauksissa sanan jakamista varten.
Katso konkreettisena esimerkkinä:
$ line="Wed Feb 7 23:30:59" $ echo $line Wed Feb 7 23:30:59
vs.:
$ line="Wed Feb 7 23:30:59" $ echo "$line" Wed Feb 7 23:30:59
Kannattaa lukea: Miksi komentosarjan komentosarjani tukahduttaa tyhjää tilaa tai muita erikoismerkkejä?
kommentit
- Esimerkki:
var='1 1'
(monilla välilyönneillä ne katoavat merkinnöistä täällä), jota seuraavatecho $var
jaecho "$var"
. - Oikea piste; se ' s lainaamaton kaiku, joka ' menettää välilyönnit.
- hyvin selvä! kiitos @JeffSchaller ja kusalananda