hale og bash: forskellige output, når det samme forventes

Jeg prøver at sortere mine logfiler og fandt ud af, at enkeltcifrede datoer blev skåret forkert. Nu vil jeg enten tilføj et 0, eller fjern det ekstra mellemrum.
Før det ville jeg se, hvordan man får de korrekte linjer, jeg vil redigere.

En hale på de sidste 3 linjer:

$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) 

Nu arbejdede jeg mig på scriptet og skrev dette i forventning om at få det samme resultat:

$ 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 fjernes den ekstra plads før 7. Jeg forventede ikke, at dette skulle ske. Jeg klipper ikke det med mit script, er jeg?

På forhånd tak!

Kommentarer

Svar

Du bemærker det samme for alle andre fordoblede (eller flere) mellemrum. Ikke-citerede variable udvidelser efterfølges af ordopdeling , så når ordene er opdelt med mellemrum (IFS), samles de igen med et mellemrum imellem dem.

En løsning kan være :

Skallen scanner resultaterne af parameterudvidelse, kommandosubstitution og aritmetisk udvidelse som ikke forekommer inden for dobbelt anførselstegn for ordopdeling.

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 værd at læse: Hvorfor kvæler mit shell-script i det hvide rum eller andre specialtegn?

Kommentarer

  • Eksempel: var='1 1' (med mange mellemrum forsvinder de i markeringen her) efterfulgt af echo $var og echo "$var".
  • Fremragende punkt, faktisk; det ' er det ikke-citerede ekko, som ' mister mellemrummene.
  • meget klart! tak @JeffSchaller og kusalananda

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *