Le principe général d'une commande Unix/Linux est la suivante
clavier => commande => écran
A partir de ce principe simplissime, et en utilisant les redirections entrées et sorties, on peut enchainer tout un ensemble de commandes à suivre. Chaque commande étant elle-même très simple mais l'enchainement créé donnera un traitement complexe pouvant s'appliquer aussi aux fichiers puisqu'il suffira d'utiliser la commande cat qui envoie un fichier à l'écran et en commençant la redirection à partir de cette commande
Cet enchainement aura la forme générale suivante
cat fichier_input |commande1 |commande2 |commande3 |commande4 |... |commandeX > fichier_output
Exemple
Code :
- cat monfichier |sed '$d' >result
|
C'est le principe de base.
Cependant certaines commandes plus complètes acceptent de recevoir elles-mêmes le fichier en paramètre. Elles s'occupent alors elles-mêmes de le lire. sed en fait partie. Donc l'exemple précédent peut se réduire en
Code :
- sed '$d' monfichier >result
|
ce qui évite un processus.
D'un autre coté, le mécanisme de sortie est invariant. La dernière commande de la chaine enverra son résultat à l'écran ce qui permettra dans un autre cas de l'imbriquer dans une autre chaine (comme un lego).
De plus, la redirection finale commence par écraser le fichier de sortie. Il s'ensuit que si on tente la syntaxe suivante
cat fichier |traitement >fichier
On perd tout puisque le shell commence par écraser le fichier. Ainsi, si on doit modifier son fichier input, il faut passer par 2 phases
Code :
- cat fichier |traitement >fichier_temporaire
- mv fichier_temporaire fichier
|
En faisant bien attention aux accès concurrents (que se passe-t-il pour "fichier_temporaire" si 2 utilisateurs lancent ce code en même temps => penser donc à utiliser un nom unique pour "fichier_temporaire" en faisant intervenir la variable "$$" dans son nom)
Cependant, certaines commandes très rares ont été créées pour s'occuper elles-mêmes de la phase "fichier_temporaire". Je connaissais "sort" avec l'option "-o" mais il semble que "sed" avec "-i" puisse aussi le faire.
C'est ce qui se passe quand tu fais "sed -i.bak '$d' monfichier".
Maintenant, si tu dois faire plusieurs modifs dans ton fichier, tu peux aussi passer par "vi" en automatisé. C'est un processus lourd mais 100% garanti.
Exemple
Code :
- vi monfichier <<_EOT_ >/dev/null
- :3
- dd
- :w!
- :q
- _EOT_
|
C'est pas forcément utile pour juste la suppression de la ligne 3 mais pour des modifs plus complexes, ça peut être intéressant...
Message édité par Sve@r le 14-08-2008 à 09:31:29
---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.