Explication sur awk
Fermé
koma_666
Messages postés
429
Date d'inscription
mardi 26 juin 2007
Statut
Membre
Dernière intervention
9 mai 2016
-
22 juin 2011 à 14:37
mamiemando Messages postés 33361 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 15 novembre 2024 - 23 juin 2011 à 14:29
mamiemando Messages postés 33361 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 15 novembre 2024 - 23 juin 2011 à 14:29
A voir également:
- Explication sur awk
- Foyer netflix explication - Accueil - Guide streaming
- Another earth explication fin - Forum Cinéma / Télé
- The farm explication fin ✓ - Forum Cinéma / Télé
- The descent 2 explication fin - Forum Cinéma / Télé
- Paris multiple 2/6 explication - Forum Excel
3 réponses
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 417
22 juin 2011 à 16:16
22 juin 2011 à 16:16
Salut,
@qqchquicommenceparQ
@mamiemando
Attention !!!
Notez que le caractère entre "[.]" peut être n'importe lequel et même plusieurs ;-)
@qqchquicommenceparQ
@mamiemando
Attention !!!
awk -F " " '/<defunct>/{print "kill -9",$2}'retournera aussi le PID de "awk" ;-((
awk -F " " '/<def[u]nct>/{print "kill -9",$2}'Ne retournera que les bons PID ;-)
Notez que le caractère entre "[.]" peut être n'importe lequel et même plusieurs ;-)
Utilisateur anonyme
22 juin 2011 à 14:50
22 juin 2011 à 14:50
salut,
le grep est inutile.
mais, qu'est-ce tu ne comprends pas ?
c'est pourtant limpide : pour chaque ligne où "defunct" apparaît, awk imprime kill -9 et le deuxième champ, pour que sh exécute la commande.
le grep est inutile.
ps -eaf | awk -F " " '/defunct/{print "kill -9",$2}' | sh
mais, qu'est-ce tu ne comprends pas ?
c'est pourtant limpide : pour chaque ligne où "defunct" apparaît, awk imprime kill -9 et le deuxième champ, pour que sh exécute la commande.
mamiemando
Messages postés
33361
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
15 novembre 2024
7 799
22 juin 2011 à 14:52
22 juin 2011 à 14:52
Alors le mieux serait lire la doc de awk dans laquelle toute la syntaxe est expliquée ou sur wikipedia.
Concrètement awk raisonne sur un flux texte qu'il voit comme un ensemble de lignes décomposées en colonnes.
Un programme awk est composé de plusieurs blocs délimités par des accolades.
- un bloc BEGIN (lancé au début du traitement)
- un bloc END (lancé à la fin du traitement)
- et plein de blocs (lancés à chaque lecture de ligne), précédés d'une condition (par exemple une expression régulière).
Dans ton cas tu n'as ni bloc BEGIN, ni END, juste un bloc qui n'est soumis à aucune condition et qui sera donc invoqué à chaque fois qu'une ligne est lue.
L'option -F permet de spécifier le délimiteur de colonne, en l'occurrence le caractère " ". À chaque fois que awk lit une ligne, il stocke le contenu des cellules dans des variables ($1 première cellule, $2 deuxième cellule etc...). $0 regroupe toute la ligne. En l'occurrence on voit que tu récupères la deuxième cellule (ce qui correspond à la colonne des PID dans la commande ps).
Ici awk va donc mouliner chaque ligne renvoyée par la chaîne ps -eaf | grep "defunct" et la remettre sous la forme "kill -9 xxx" ou xxx est un PID de zombi. Ceci est une commande shell et il va falloir l'exécuter. C'est ce qui est fait avec la dernière partie de la chaîne (| sh).
Bon c'est pas top top top :
- on risque de voir le processus grep defunct et de le tuer
- si un processus s'appelle defunct ou prend un paramètre qui est defunct (comme c'est le cas de ton grep) il sera également tué.
Concrètement le grep pour être supprimé au profit d'une expression régulière qui serait traitée par awk. En awk, une expression régulière s'écrit entre /.../. De ce que j'en vois on pourrait même chercher le motif "<defunct>" et non "defunct". À vue de nez ça pourrait être :
Bonne chance
Concrètement awk raisonne sur un flux texte qu'il voit comme un ensemble de lignes décomposées en colonnes.
Un programme awk est composé de plusieurs blocs délimités par des accolades.
- un bloc BEGIN (lancé au début du traitement)
- un bloc END (lancé à la fin du traitement)
- et plein de blocs (lancés à chaque lecture de ligne), précédés d'une condition (par exemple une expression régulière).
Dans ton cas tu n'as ni bloc BEGIN, ni END, juste un bloc qui n'est soumis à aucune condition et qui sera donc invoqué à chaque fois qu'une ligne est lue.
L'option -F permet de spécifier le délimiteur de colonne, en l'occurrence le caractère " ". À chaque fois que awk lit une ligne, il stocke le contenu des cellules dans des variables ($1 première cellule, $2 deuxième cellule etc...). $0 regroupe toute la ligne. En l'occurrence on voit que tu récupères la deuxième cellule (ce qui correspond à la colonne des PID dans la commande ps).
Ici awk va donc mouliner chaque ligne renvoyée par la chaîne ps -eaf | grep "defunct" et la remettre sous la forme "kill -9 xxx" ou xxx est un PID de zombi. Ceci est une commande shell et il va falloir l'exécuter. C'est ce qui est fait avec la dernière partie de la chaîne (| sh).
Bon c'est pas top top top :
- on risque de voir le processus grep defunct et de le tuer
- si un processus s'appelle defunct ou prend un paramètre qui est defunct (comme c'est le cas de ton grep) il sera également tué.
Concrètement le grep pour être supprimé au profit d'une expression régulière qui serait traitée par awk. En awk, une expression régulière s'écrit entre /.../. De ce que j'en vois on pourrait même chercher le motif "<defunct>" et non "defunct". À vue de nez ça pourrait être :
ps -eaf | awk -F " " '/<defunct>/{print "kill -9",$2}' | sh
Bonne chance
23 juin 2011 à 14:29