Un peu de manipulation de awk

Tags: #<Tag:0x00007f5755661b98>

Bonjour,

Un peu de manipulation de awk.
Ecrire directement /etc/crypttab avec une seule commande utilisant juste blkid et awk:

en ayant blkid:

/dev/mapper/vg01-home: LABEL="HOME" UUID="******" TYPE="ext4"
/dev/nvme0n1p1: UUID="******" PARTUUID="51418193-675f-46cc-b580-8650c647fafd"
/dev/nvme0n1p2: UUID="******" PARTUUID="6f2584e2-0bc7-481b-acec-c69adb56efaa"
/dev/mapper/vg01-var_log_audit: LABEL="VARLOGAUDIT" UUID="******" TYPE="ext4"
/dev/mapper/vg01-var: LABEL="VAR" UUID="******" TYPE="ext4"
/dev/mapper/vg01-root: LABEL="ROOT" UUID="******" TYPE="ext4"
/dev/mapper/vg01-swap: UUID="******" TYPE="swap"
/dev/mapper/vg01-var_tmp: LABEL="VARTMP" UUID="******" TYPE="ext4"
/dev/mapper/vg01-var_log: LABEL="VARLOG" UUID="******" TYPE="ext4"
/dev/nvme1n1: UUID="******" TYPE="crypto_LUKS"
/dev/mapper/vg01-tmp: LABEL="TMP" UUID="******" TYPE="ext4"
/dev/mapper/vg01-boot: LABEL="BOOT" UUID="******" TYPE="ext4"

Avec:

~# blkid | awk '/LUKS/ {gsub(/"/, "", $2); gsub(/:/, "", $1); split($1, a, "/"); printf "%s_crypt %s %s", a[3], $2, "none luks,discard,x-init.attach,initramfs\n"}'

Pour le awk:

  • identifier les ligne qui contiennent LUKS
  • enlever les guillemet de la 2èeme colonne (UUID="…")
  • enlever le : de la colonne 1 (le device)
  • splitter le device et prendre juste le dernier terme
  • imprimer le tout dans le format crypttab

pour obtenir (uuid anonymisés):

nvme0n1p2_crypt UUID=******none luks,discard,x-init.attach,initramfs
nvme1n1_crypt UUID=****** none luks,discard,x-init.attach,initramfs

Personnellement je n’utilise pas les disque. Les partition chiffrée ont systématiquement un LABEL. La raison est simple, dans certains de manipulation, voir de mises à jour, les identifiant des disques peuvent changer et s’inverser dans le cas d’une configuration à plusieurs disque.

Ca peut provoquer un problème avec l’update-initramfs, car le nom du device luks est différent de celui du device disque auquel il est rattaché.
Avec les LABEL pas de problèmes.

C’est facile de changer le awk (essayer de le faire sans regarder ce que j’ai mis :wink:

blkid | awk '$0~/LABEL=".*" TYPE="crypto_LUKS"/ {gsub(/"/, "", $2); label=substr($3, 8, length($3)-8); printf "%s_crypt %s %s", label, $2, "none luks,discard,x-init.attach,initramfs\n"}'

pour:

Enedwaith_1_crypt UUID=****** none luks,discard,x-init.attach,initramfs
Enedwaith_2_crypt UUID=****** none luks,discard,x-init.attach,initramfs

Voilà, c’était juste pour fun :wink:

1 J'aime

Ahhh, la pertinence de awk(1) !

Là où awk passe, grep trépasse… et sed aussi ­bien souvent.
Il est bien plus souvent plus simple de faire une recherche ET un traitement d’une information avec awk que le couple grep + sed.
Attention, ce propos ne signifie pas qu’une recherche awk est forcément simple ET surtout le traitement de ladite information, car cela peut vite devenir très compliqué, mais extrêmement puissant car il peut faire appel à des fonctions, avant traitement et/ou après… pfffiou !

:stuck_out_tongue: :smiley: :wink:


Voici deux exemples assez basiques en soit :

⇒ recherche et incrémentation d’un compteur pour ne retenir qu’une fois une recherche et l’enregistrer dans le fichier :

awk '/(GET|HEAD|POST)/ !a[$1]++ { print $1 }' "${fichier}" >> "${fichier2}"

analyse les logs du serveur nginx pour capturer l’adresse IP écrite dans la colonne 1


awk '/(Invalid user|banner exchange)/ { print $10 }' "${log}" >> ${fichier_x}"

analyse le log authlog pour récupérer l’adresse IP concernée et la retourner dans un fichier tiers.

En réalité, la ligne correspondante est plus « complexe » :

set -A ips -- $(awk '/(Invalid user|banner exchange)/ { print $10 }' "${log}" | perl -MRegexp::Common=net -nE 'say $& while /$RE{net}{IPv4}|$RE{net}{IPv6}/g' | sort -u)
  • je recherche les adresses IP contenues dans la colonne 10 du fichier log
  • les passent à la moulinette écrites en PERL pour vérifier qu’on a bien affaire à une adresse IPv(4|6) valides
  • et les enregistres dans un array
    dont le but est d’alimenter un fichier "lisible "par l’outil pf d’OpenBSD, adresses IP injectées dans une table ; pour « casser la connexion » des adresses IP, information libérée qu’à une date ultérieure. Toute connexion suivante de ladite IP finira aussitôt en étant « droppé » !
1 J'aime