Ik “probeer mijn logboeken te sorteren en ontdekte dat datums met één cijfer verkeerd werden geknipt. Nu wil ik voeg een 0 toe of verwijder de extra spatie.
Daarvoor wilde ik zien hoe ik de juiste regels kon krijgen die ik wil bewerken.
Een staart van de laatste 3 regels:
$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 ik naar het script werk, schreef ik dit in de verwachting hetzelfde resultaat te krijgen:
$ 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)
Maar hiermee wordt de extra spatie voor de 7 verwijderd. Ik had niet verwacht dat dit zou gebeuren. Ik “knip het toch niet uit met mijn script?
Bij voorbaat dank!
Reacties
- Wat is woordsplitsing? Waarom is het belangrijk bij shell-programmering? , en BashGuide: Woordsplitsing
- Of misschien moeten we dit gewoon markeren als een duplicaat van Waarom verslikt mijn shellscript in witruimte of andere speciale tekens?
- geweldige link @ilkkachu
Antwoord
Je “zou hetzelfde opmerken voor alle andere dubbele (of meer) spaties. Variabele uitbreidingen zonder aanhalingstekens worden gevolgd door woordsplitsing , dus zodra de woorden zijn opgesplitst door spaties (IFS), worden ze opnieuw samengesteld met één spatie ertussen.
Een mogelijke oplossing kan zijn :
De shell scant de resultaten van parameteruitbreiding, opdrachtvervanging en rekenkundige uitbreiding die niet komen voor tussen dubbele aanhalingstekens voor woordsplitsing.
Zie voor een concreet voorbeeld:
$ 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
Het is de moeite waard om te lezen: Waarom verslikt mijn shellscript in witruimte of andere speciale tekens?
Opmerkingen
- Voorbeeld:
var='1 1'
(met veel spaties verdwijnen ze in de opmaak hier) gevolgd doorecho $var
enecho "$var"
. - Uitstekend punt eigenlijk; het ' is de niet-aangehaalde echo dat ' de spaties verliest.
- heel duidelijk! bedankt @JeffSchaller en kusalananda