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
- Vad är orddelning? Varför är det viktigt i skalprogrammering? och BashGuide: Word Splitting
- Eller kanske borde vi bara markera detta som en duplikat av Varför kväver mitt skalskript på blanksteg eller andra specialtecken?
- bra länk @ilkkachu
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 avecho $var
ochecho "$var"
. - Utmärkt punkt, faktiskt; det ' är det ociterade ekot som ' förlorar mellanslag.
- mycket tydligt! tack @JeffSchaller och kusalananda