svans och bash: olika utdata när samma förväntas

Jag försöker sortera mina loggar och fann att ensiffriga datum klippts fel. Nu vill jag antingen lägga till ett 0 eller ta bort det extra utrymmet.
Innan det ville jag se hur jag får rätt rader som jag vill redigera.

En svans på de tre sista raderna:

$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 arbetade jag mig fram till skriptet, jag skrev detta och förväntade mig att få samma 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 detta tas det extra utrymmet innan 7 bort. Jag förväntade mig inte att det skulle hända. Jag skär inte det med mitt skript, eller hur?

Tack på förhand!

Kommentarer

Svar

Du skulle märka detsamma för alla andra fördubblade (eller fler) mellanslag. Ociterade variabla utvidgningar följs av orddelning , så när orden delas upp med mellanslag (IFS), sätts de ihop igen med ett mellanslag mellan dem.

En lösning kan vara :

Skalet skannar resultaten av parameterutvidgning, kommandosubstitution och aritmetisk expansion som inte förekommer inom dubbla citat för orduppdelning.

Som ett konkret exempel, se:

$ line="Wed Feb 7 23:30:59" $ echo $line Wed Feb 7 23:30:59 

kontra:

$ line="Wed Feb 7 23:30:59" $ echo "$line" Wed Feb 7 23:30:59 

Det är väl värt att läsa: Varför kväver mitt skalskript i det vita utrymmet eller andra specialtecken?

Kommentarer

  • Exempel: var='1 1' (med många mellanslag försvinner de i markeringen här) följt av echo $var och echo "$var".
  • Utmärkt punkt, faktiskt; det ' är det ociterade ekot som ' förlorar mellanslag.
  • mycket tydligt! tack @JeffSchaller och kusalananda

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *