hale og bash: forskjellig utgang når det samme forventes

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

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 av echo $var og echo "$var".
  • Utmerket poeng, faktisk; det ' er det ikke siterte ekkoet som ' mister mellomrommene.
  • veldig tydelig! takk @JeffSchaller og kusalananda

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *