Jessaye de trier mes journaux et jai trouvé que les dates à un chiffre ont été coupées incorrectement. Maintenant, je veux soit ajoutez un 0, soit supprimez lespace supplémentaire.
Avant cela, je voulais voir comment obtenir les lignes correctes que je souhaite modifier.
Une queue des 3 dernières lignes:
$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)
En cherchant maintenant mon chemin vers le script, jai écrit ceci en espérant obtenir le même résultat:
$ 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)
Mais avec cela, lespace supplémentaire avant le 7 est supprimé. Je ne mattendais pas à ce que cela se produise. Je ne le coupe pas avec mon script, nest-ce pas?
Merci davance!
Commentaires
- Quest-ce que le fractionnement de mots? Pourquoi est-ce important dans la programmation shell? , et BashGuide: Word Splitting
- Ou peut-être devrions-nous simplement le marquer comme un duplicate of Pourquoi mon script shell sétouffe-t-il avec des espaces ou dautres caractères spéciaux?
- great link @ilkkachu
Réponse
Vous remarqueriez la même chose pour tous les autres espaces doublés (ou plus). Les expansions de variables sans guillemets sont suivies de la division des mots , donc une fois que les mots sont séparés par des espaces (IFS), ils sont réassemblés avec un espace entre eux.
Une solution de rechange peut être :
Le shell analyse les résultats de lexpansion des paramètres, de la substitution de commandes et de lexpansion arithmétique qui ne lont pas fait se trouvent entre guillemets pour le fractionnement de mots.
À titre dexemple concret, voir:
$ line="Wed Feb 7 23:30:59" $ echo $line Wed Feb 7 23:30:59
contre:
$ line="Wed Feb 7 23:30:59" $ echo "$line" Wed Feb 7 23:30:59
Il vaut la peine de lire: Pourquoi mon script shell sétouffe-t-il avec des espaces ou dautres caractères spéciaux?
Commentaires
- Exemple:
var='1 1'
(avec de nombreux espaces, ils disparaissent dans le balisage ici) suivi deecho $var
etecho "$var"
. - Excellent point, en fait; il ' est lécho sans guillemets que ' perd les espaces.
- très clair! merci @JeffSchaller et kusalananda