Jeg prøver å sortere loggene mine og fant ut at ensifrede datoer ble kuttet feil. Nå vil jeg enten legg til en 0, eller fjern ekstra plass.
Før det ønsket jeg å se hvordan jeg skulle få de riktige linjene jeg vil redigere.
En hale på de siste 3 linjene:
$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)
Nå som jeg jobbet meg frem til skriptet, skrev jeg dette og forventet å få det samme resultatet:
$ 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)
Men med dette blir den ekstra plassen før 7. fjernet. Jeg forventet ikke at dette skulle skje. Jeg klipper det ikke med skriptet mitt, er jeg?
Takk på forhånd!
Kommentarer
- Hva er orddeling? Hvorfor er det viktig i skallprogrammering? , og BashGuide: Word Splitting
- Eller kanskje vi bare bør merke dette som en duplikat av Hvorfor kveles skallskriptet mitt på mellomrom eller andre spesialtegn?
- flott lenke @ilkkachu
Svar
Du vil merke det samme for alle andre doblede (eller flere) mellomrom. Ikke siterte variable utvidelser blir fulgt av orddeling , så når ordene er delt av mellomrom (IFS), settes de sammen igjen med ett mellomrom mellom dem.
En løsning kan være :
Skallet skanner resultatene av parameterutvidelse, kommandosubstitusjon og aritmetisk utvidelse som ikke forekommer innenfor doble anførselstegn for orddeling,
Som et konkret eksempel, se:
$ 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
Det er vel verdt å lese: Hvorfor kveles skallskriptet mitt på hvitt mellomrom eller andre spesialtegn?
Kommentarer
- Eksempel:
var='1 1'
(med mange mellomrom forsvinner de i markeringen her) etterfulgt avecho $var
ogecho "$var"
. - Utmerket poeng, faktisk; det ' er det ikke siterte ekkoet som ' mister mellomrommene.
- veldig tydelig! takk @JeffSchaller og kusalananda