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
- Che cosè la divisione delle parole? Perché è importante nella programmazione della shell? e BashGuide: Word Splitting
- O forse dovremmo semplicemente contrassegnarlo come duplicato di Perché il mio script di shell si blocca su spazi vuoti o altri caratteri speciali?
- ottimo link @ilkkachu
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 daecho $var
eecho "$var"
. - Ottimo punto, in realtà; ' è leco non quotato che ' sta perdendo gli spazi.
- molto chiaro! grazie @JeffSchaller e kusalananda