tail en bash: verschillende uitvoer wanneer hetzelfde wordt verwacht

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

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 door echo $var en echo "$var".
  • Uitstekend punt eigenlijk; het ' is de niet-aangehaalde echo dat ' de spaties verliest.
  • heel duidelijk! bedankt @JeffSchaller en kusalananda

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *