tail e bash: output diverso quando ci si aspetta lo stesso

Sto cercando di ordinare i miei log e ho scoperto che le date a una sola cifra sono state tagliate in modo errato. Ora voglio aggiungi uno 0 o rimuovi lo spazio extra.
Prima di questo, volevo vedere come ottenere le righe corrette che desidero modificare.

Una coda delle ultime 3 righe:

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

Ora lavorando allo script, ho scritto questo aspettandomi di ottenere lo stesso risultato:

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

Ma con questo, lo spazio extra prima che il 7 venga rimosso. Non mi aspettavo che ciò accadesse. Non lo sto tagliando con il mio script, vero?

Grazie in anticipo!

Commenti

Risposta

Noterai lo stesso per qualsiasi altro spazio raddoppiato (o più). Le espansioni di variabili non quotate sono seguite dalla suddivisione delle parole , quindi una volta che le parole sono divise per spazi (IFS), vengono riassemblate con uno spazio tra di loro.

Una soluzione può essere :

La shell analizza i risultati dellespansione dei parametri, della sostituzione dei comandi e dellespansione aritmetica che non ha si trovano tra virgolette doppie per la suddivisione delle parole.

Come esempio concreto, vedere:

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

rispetto a:

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

Vale la pena leggere: Perché il mio script di shell si blocca su spazi o altri caratteri speciali?

Commenti

  • Esempio: var='1 1' (con molti spazi, scompaiono nel markup qui) seguito da echo $var e echo "$var".
  • Ottimo punto, in realtà; ' è leco non quotato che ' sta perdendo gli spazi.
  • molto chiaro! grazie @JeffSchaller e kusalananda

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *