Archives de catégorie : AWK

[Awk] : comment lister les ports des vhosts d’un apache ? (gsub, match, substr et regex)

Awk c’est un peu mon petit préféré pour faire du oneline en manipulant des lignes. Et une fois de plus, il est encore bien sympa pour nous lister les ports utilisés pour chaque vhost d’un apache. Bon on se fait un peu plaisir vous allez voir… et c’est pas pour frimer.

En gros, on veut un truc qui nous dise :

nom_du_vhost  =>> numéro_port

y compris si nous avons plusieurs ports (80 et 443).

Et en une ligne, voici le code que j’ai pu écrire :

awk '/.*:[0-9]{1,3}>/ && /[^#]/
{match($0,/:[0-9]{1,3}>/);
gsub("/.*/"," ",FILENAME);
print FILENAME"=>>", 
substr($0, RSTART+1, RLENGTH-2)}'
/etc/apache2/*.*

Explications de cette commande d’une ligne un peu chargée :

  • 1ère ligne : restriction des lignes traitées en limitant aux lignes contenant « : » puis 1 à 3 chiffres allant de 0 à 9 et qui ne contient pas de « # » (pour éviter les lignes de commentaires)
  • 2ème ligne : capture du pattern du port encadre de « : » et « > »
  • 3ème ligne : nettoyage du filename en retournant uniquement le nom de fichier
  • 5ème ligne : récupération du pattern de la regex

C’est un peu compliqué mais cela permet surtout de faire un peu de la manipulation pour s’entretenir en awk.

Et vous vous feriez comment pour réaliser ce genre d’opération ?

[Linux] : lister les ports en écoute sur une machine

La base pour les sysadmin, on a souvent besoin pour diagnostiquer des problèmes de lister les ports en écoute sur un serveur. Deux binaires peuvent réaliser ceci sans problème : netstat ou lsof.

Avec lsof :

sudo lsof -i -P | egrep LISTEN | awk -F ":" '{print $2}' |sort -u


Avec netsat :

netstat -ntaup | awk '/LISTEN/ && match($0,/:[0-9]+/) {print substr( $0, RSTART+1, RLENGTH )}' | sort -u


De la même manière on peut lister les connexions établies pour connaître les machines connectées :

netstat -ntaup | awk '/ESTABLISHED/ {print $5}'


[Awk][Linux] : Lister les processus non killable et le stopper avec ps aux + awk

La commande PS possède une multitude d’options et un affiche un grand nombre d’éléments. On ne va pas tous les passés en revue rassurez vous. Aujourd’hui, je vous propose un moyen simple de lister les process non killable. C’est ultra simple car il suffit de lire la colonne status de PS.

Cette colonne contient généralement une ou deux lettres :

  • R : en cours
  • S : interrompable
  • s : c’est une session maitre
  • l : multi-threadé
  • < : priorité haute
  • + : processus d’arrière plan
  • D : non killable

C’est se dernier cas qui peut être plus gênant car ce process ne peut être arrêté. Et pour lister les processus en fonction d’un statut c’est awk :

ps aux | awk '{if ($8 ~ "D") print $0}'

Pour le stopper ce n’est pas simple car un kill -9 du pid ne marchera pas. On peut éventuellement tenter un reboot forcé :

reboot -n -f

C’est un peu moche c’est clair. J’imagine qu’avec un lsof on peut aussi identifié le filesystem utilisé et le démonté. C’est pas beaucoup plus jolie.

Plus d’infos sur le site noah.org et bien sûr la man page de PS

[Awk] : convertir un csv en sql

Encore une petite commande pour débuter et bien pratique. Nhésitez pas en commentaire à partager votre expérience sur ce genre de conversion.

Awk va nous permettre de facilement convertir un csv en sql. D’ailleurs je suis en train de me dire qu’il faudrait que je passe un peu de temps dessus pour faire en sorte qu’il s’adapte automatiquement à toutes les longueurs de csv voir à récupérer l’entête pour les noms de champs ça serait plus malin.

En tout cas pour l’instant voici comment j’utilise régulièrement awk pour convertir mes fichiers csv (ou autre parfois) en sql.

# contenu du csv
cat attention.csv 
1;xav;dd;25d;28
2;paul;aa;25f;100

# ligne de commande
cat attention.csv | awk -F ";" '{print "INSERT INTO matable (champs1, champs2, champs3, champs4, champs5) values ('\''"$1"'\'', '\''"$2"'\'', '\''"$3"'\'', '\''"$4"'\'', '\''"$5"'\'');"}'

# le résultat
INSERT INTO matable (champs1, champs2, champs3, champs4, champs5) values ('1', 'xav', 'dd', '25d', '28');
INSERT INTO matable (champs1, champs2, champs3, champs4, champs5) values ('2', 'paul', 'aa', '25f', '100');
INSERT INTO matable (champs1, champs2, champs3, champs4, champs5) values ('3', 'thierry', 'bb', '14g', '75');

Donc :

  • tout simplement on défini le séparateur avec -F
  • on print en insérant les variable des champs
  • la seule suptilité c’est d’échapper les quotes.