0Pricing
DevOps Bootcamp · Leçon

Enregistrements, champs et séparateurs personnalisés dans awk

Contrôlez les séparateurs de champs d’entrée et de sortie pour découper les lignes CSV, TSV et de journaux en colonnes claires.

Enregistrements, champs et séparateurs personnalisés dans awk est une leçon DevOps Bootcamp gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage DevOps Bootcamp, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours DevOps Bootcamp comprend 4 leçons au total.

Que sont les enregistrements et les champs dans awk ?

awk lit l'entrée ligne par ligne. Chaque ligne est appelée un enregistrement, et chaque bloc séparé par des espaces dans cette ligne est appelé un champ.

  • $0 — l'enregistrement actuel entier (la ligne complète)
  • $1 — le premier champ
  • $2 — le deuxième champ
  • $NF — le dernier champ (NF = nombre de champs)

Par défaut, awk sépare les champs à chaque suite d'espaces (espaces ou tabulations). Cela le rend immédiatement utile pour l'analyse des journaux, la sortie de commandes et les données séparées par des espaces.

#!/usr/bin/env bash
# Show how awk sees records and fields
echo 'alice 30 engineer' | awk '{ print "Name:", $1, "Age:", $2, "Role:", $3 }'

# $NF is always the last field — regardless of how many there are
echo 'one two three four five' | awk '{ print "Last field:", $NF }'

Le séparateur de champs d'entrée : FS

La variable intégrée FS (séparateur de champs) indique à awk comment diviser chaque enregistrement en champs. Sa valeur par défaut est une espace unique, ce qui active le mode de séparation sur les espaces.

Vous pouvez définir FS de deux façons :

  • Avec l'option -F sur la ligne de commande : awk -F':'
  • Dans un bloc BEGIN : BEGIN { FS = ":" }

Les deux méthodes sont équivalentes. L'approche avec le bloc BEGIN est préférable dans les scripts plus longs, car elle conserve la configuration dans le script lui-même, ce qui le rend plus lisible et portable.

#!/usr/bin/env bash
# Parse /etc/passwd using ':' as the field separator
# Field 1 = username, field 3 = UID, field 7 = shell
echo 'root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin' \
  | awk -F':' '{ print $1, "UID="$3, "shell="$7 }'

Définir FS dans le bloc BEGIN

Pour les scripts plus longs qu'une commande sur une seule ligne, placer FS dans un bloc BEGIN est la pratique standard. Le bloc BEGIN s'exécute avant qu'awk ne lise la moindre donnée d'entrée ; le séparateur est donc prêt pour le premier enregistrement.

Ce modèle permet également de définir plusieurs variables à la fois, d'ajouter des commentaires et de conserver votre logique dans un fichier de script autonome.

Voici des séparateurs courants que vous rencontrerez :

  • Deux-points : — /etc/passwd, /etc/shadow
  • Tabulation \t — exports TSV, sortie de compilateurs
  • Virgule , — fichiers CSV (simples, sans champs entre guillemets)
  • Barre verticale | — certains formats de journaux, vidages de bases de données
#!/usr/bin/env bash
# awk script using BEGIN to set FS for TSV input
printf 'alice\t30\tengineer\nbob\t25\tdesigner\ncarol\t35\tmanager\n' \
  | awk 'BEGIN { FS = "\t" } { printf "%-10s age=%-3s role=%s\n", $1, $2, $3 }'

Analyser des fichiers CSV avec awk

Le format CSV (valeurs séparées par des virgules) est l'un des formats de données les plus courants dans l'ingénierie shell. Définir FS="," permet à awk de traiter les virgules comme des délimiteurs.

Point important : la gestion CSV intégrée d'awk ne prend pas en compte les champs entre guillemets qui contiennent des virgules (par exemple, "Smith, John"). Pour les fichiers CSV simples sans virgules entre guillemets, cela fonctionne parfaitement. Pour les fichiers CSV conformes à la norme RFC 4180 et contenant des champs entre guillemets, utilisez un analyseur CSV adapté ou miller/csvkit.

Une tâche courante consiste à extraire des colonnes précises et à filtrer les lignes selon leur valeur : avec awk, ces deux opérations sont triviales une fois que FS est défini.

#!/usr/bin/env bash
# Simple CSV: extract name and salary columns, filter salary > 50000
data='name,department,salary
alice,engineering,95000
bob,marketing,48000
carol,engineering,112000
dave,hr,45000'

echo "$data" | awk -F',' '
  NR == 1 { next }          # skip header row
  $3 > 50000 { print $1, "earns", $3 }
'

Séparateurs de champs à plusieurs caractères et par expression régulière

Le FS d'awk ne se limite pas à un seul caractère : il peut contenir une expression régulière. Cela est particulièrement puissant pour les formats de journaux réels, où les champs sont séparés par des délimiteurs de longueur variable.

Exemples de séparateurs par expression régulière :

  • FS = "[,;]" — séparer sur une virgule ou un point-virgule
  • FS = "[ \t]+" — séparer sur un ou plusieurs espaces ou tabulations (comme par défaut, mais explicitement)
  • FS = "::" — séparer sur un double deux-points littéral
  • FS = "\\|" — séparer sur une barre verticale (qui doit être échappée)

Lorsque FS est une expression régulière, awk (gawk) la traite comme un motif et non comme une chaîne littérale.

#!/usr/bin/env bash
# Log lines with mixed delimiters: split on " | " or "::" or ","
# Here we split on one or more spaces or pipe characters
printf '2024-01-15 | ERROR | disk full | /dev/sda1\n2024-01-15 | INFO  | startup ok | main\n' \
  | awk -F' \\| ' '{ printf "date=%-12s level=%-6s msg=%s\n", $1, $2, $3 }'

# Split on multiple possible delimiters using character class
echo 'alpha,beta;gamma,delta;epsilon' \
  | awk -F'[,;]' '{ for(i=1; i<=NF; i++) print i": "$i }'

Le séparateur de champs de sortie : OFS

OFS (séparateur de champs de sortie) contrôle ce qu'awk place entre les champs lorsque vous reconstruisez un enregistrement avec print. Sa valeur par défaut est une espace unique.

L'idée essentielle est la suivante : OFS n'est inséré entre les champs que lorsque vous utilisez la syntaxe avec virgules dans print, ou lorsque vous affectez une valeur à un champ et qu'awk reconstruit $0. Si vous concaténez avec des espaces dans le code source, OFS n'est pas utilisé.

  • print $1, $2, $3 — les virgules déclenchent l'insertion de OFS entre les champs
  • print $1 " " $2 — espace explicite, OFS ignoré

Modèle courant : lire un fichier CSV, le transformer, puis écrire un fichier TSV en définissant FS="," et OFS="\t".

#!/usr/bin/env bash
# Convert CSV to TSV using FS and OFS
data='alice,30,engineer
bob,25,designer
carol,35,manager'

echo "$data" | awk 'BEGIN { FS=","; OFS="\t" } { print $1, $2, $3 }'

echo '---'

# OFS also applies when you modify a field — awk rebuilds $0 with OFS
echo 'alice,30,engineer' | awk 'BEGIN { FS=","; OFS=" | " } { $1=$1; print $0 }'

Forcer awk à reconstruire $0 avec OFS

Il existe une astuce subtile mais importante : affecter une valeur à n'importe quel champ (même lui affecter sa propre valeur, $1=$1) force awk à reconstruire $0 en joignant tous les champs avec OFS.

C'est la manière idiomatique de reformater les délimiteurs d'un enregistrement sans afficher manuellement chaque champ :

  • Définissez FS sur le délimiteur d'entrée
  • Définissez OFS sur le délimiteur de sortie souhaité
  • Déclenchez la reconstruction avec $1=$1
  • Affichez $0

Cette approche s'adapte à n'importe quel nombre de champs et évite de coder en dur $1, $2, $3, ....

#!/usr/bin/env bash
# Reformat a pipe-delimited file to comma-separated WITHOUT listing every field
printf 'alice|30|engineer|london\nbob|25|designer|paris\ncarol|35|manager|berlin\n' \
  | awk 'BEGIN { FS="|"; OFS="," } { $1=$1; print $0 }'

# Useful when you don't know how many fields there are:
printf 'a|b|c|d|e|f|g\n1|2|3|4|5|6|7\n' \
  | awk 'BEGIN { FS="|"; OFS="\t" } { $1=$1; print $0 }'

Le séparateur d’enregistrements : RS

Tout comme FS sépare les champs au sein d’un enregistrement, RS (séparateur d’enregistrements) définit ce qui sépare les enregistrements les uns des autres. Par défaut, RS est un newline, donc awk traite une ligne à la fois.

Modifier RS permet un traitement puissant des enregistrements répartis sur plusieurs lignes :

  • RS="" — mode paragraphe : les lignes vides séparent les enregistrements (les champs peuvent s’étendre sur plusieurs lignes)
  • RS=";" — séparation sur les points-virgules (utile pour les exportations SQL)
  • RS="\n" — newline explicite (valeur par défaut)

En mode paragraphe (RS=""), FS sert toujours à séparer les champs au sein de l’enregistrement réparti sur plusieurs lignes, et les sauts de ligne présents dans un enregistrement sont également automatiquement traités comme des séparateurs de champs.

#!/usr/bin/env bash
# Paragraph mode: each blank-line-separated block is one record
# Useful for processing structured text blocks (e.g., stanzas, config sections)
data='Name: Alice
Role: Engineer
City: London

Name: Bob
Role: Designer
City: Paris'

echo "$data" | awk 'BEGIN { RS=""; FS="\n" } {
  print "Record", NR":"
  for (i=1; i<=NF; i++) print "  ", $i
  print ""
}'

Le séparateur d’enregistrements de sortie : ORS

ORS (séparateur d’enregistrements de sortie) est affiché après chaque instruction print. Par défaut, il s’agit d’un newline (\n), ce qui explique pourquoi chaque print passe à la ligne.

Modifier ORS vous permet de :

  • Joindre les enregistrements sur une seule ligne : ORS=" "
  • Ajouter des lignes vides entre les enregistrements de sortie : ORS="\n\n"
  • Créer des formats de sortie personnalisés, comme des fragments JSON ou XML

Notez que printf n’utilise pas ORS : celui-ci s’applique uniquement à l’instruction print seule. Utilisez printf lorsque vous avez besoin d’un contrôle total sur le formatage.

#!/usr/bin/env bash
# Join all matching lines onto one line by setting ORS to a space
printf 'apple\nbanana\ncherry\ndate\n' | awk '{ ORS=" " } { print $0 }'
echo  # final newline

# Add a blank line after every output record for readability
printf 'alice 30 engineer\nbob 25 designer\ncarol 35 manager\n' \
  | awk 'BEGIN { ORS="\n\n" } { print $1, "is a", $3 }'

Exemple pratique : analyser les journaux d’accès Apache

Les journaux d’accès Apache/nginx suivent un format bien connu, avec des champs séparés par des espaces. Certains champs (comme l’horodatage) contiennent des espaces et sont encadrés par des crochets ou des guillemets, ce qui rend la séparation directe des champs avec awk délicate.

Une approche pratique consiste à utiliser un FS correspondant à la structure, ou à extraire des champs précis par leur position en connaissant le format exact.

Les champs du format de journal combiné sont approximativement les suivants :

  1. IP du client
  2. Identifiant (généralement -)
  3. Utilisateur authentifié (généralement -)
  4. Horodatage (entre crochets, il compte comme un seul jeton)
  5. Méthode+chemin+protocole de la requête (entre guillemets)
  6. Code d’état HTTP
  7. Octets de la réponse
#!/usr/bin/env bash
# Parse a simulated Apache Combined Log Format line
# Extract: IP, status code, bytes, and request path
logs='192.168.1.10 - alice [15/Jan/2024:10:23:45 +0000] "GET /api/users HTTP/1.1" 200 1523
10.0.0.5 - - [15/Jan/2024:10:23:46 +0000] "POST /login HTTP/1.1" 401 89
172.16.0.3 - bob [15/Jan/2024:10:23:47 +0000] "GET /dashboard HTTP/1.1" 200 8741'

echo "$logs" | awk '{
  ip     = $1
  status = $9
  bytes  = $10
  # Extract the request path from the quoted string in field 7
  split($7, parts, "/")
  path = "/" parts[2]
  printf "ip=%-15s status=%s bytes=%-6s endpoint=%s\n", ip, status, bytes, path
}'

Combiner FS, OFS, RS et ORS dans un pipeline

Dans la pratique de l’ingénierie shell, vous utilisez rarement ces séparateurs isolément. Un schéma courant consiste à utiliser awk comme convertisseur de format au milieu d’un pipeline, afin de transformer un format structuré en un autre.

Points essentiels pour combiner les séparateurs :

  • Définissez toujours FS et OFS ensemble dans BEGIN lors de la conversion de formats
  • Utilisez $1=$1 pour déclencher la reconstruction de $0 lorsque vous souhaitez reformater tous les champs sans les énumérer
  • Ne modifiez RS que lorsque vos enregistrements s’étendent réellement sur plusieurs lignes
  • Utilisez ORS pour contrôler l’espacement entre les enregistrements de sortie
  • Préférez printf pour un formatage précis ; utilisez print lorsque la terminaison automatique par ORS est pratique
#!/usr/bin/env bash
# Full pipeline: read a colon-delimited file,
# filter rows where field 3 (UID) >= 1000 (real users),
# then output as tab-separated: username, UID, home dir
echo 'root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
alice:x:1001:1001:Alice:/home/alice:/bin/bash
bob:x:1002:1002:Bob:/home/bob:/bin/zsh
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin' \
  | awk 'BEGIN { FS=":"; OFS="\t" } $3 >= 1000 { print $1, $3, $6 }'

Vérification des connaissances : OFS et reconstruction des champs

Vérifiez votre compréhension de l’interaction entre OFS et l’affectation de champs dans awk.

Récapitulatif de la leçon : enregistrements, champs et séparateurs

Vous contrôlez désormais entièrement la manière dont awk lit et écrit les données structurées. Voici un résumé des quatre variables de séparation :

  • FS — séparateur de champs d’entrée. À définir avec -F ou dans BEGIN. Il peut s’agir d’un caractère, d’une chaîne ou d’une expression régulière. Valeur par défaut : espaces blancs.
  • OFS — séparateur de champs de sortie. Inséré entre les champs dans les appels print $1, $2 et lorsque awk reconstruit $0 après l’affectation d’un champ. Valeur par défaut : une seule espace.
  • RS — séparateur d’enregistrements d’entrée. Définit ce qui sépare les enregistrements (lignes). Valeur par défaut : newline. Définissez-le comme une chaîne vide pour le mode paragraphe.
  • ORS — séparateur d’enregistrements de sortie. Ajouté après chaque print. Valeur par défaut : newline. Modifiez-le pour joindre les lignes ou ajouter des espaces.

Le schéma le plus important à retenir est le suivant : définissez FS et OFS dans BEGIN, puis utilisez $1=$1 pour reconstruire $0 chaque fois que vous souhaitez reformater les délimiteurs de tous les champs sans coder en dur leurs positions. Ce schéma fonctionne avec des fichiers comportant n’importe quel nombre de colonnes et constitue la base des pipelines de conversion de formats fondés sur awk.

Questions Fréquemment Posées

La leçon « Enregistrements, champs et séparateurs personnalisés dans awk » est-elle gratuite ?

Oui — le texte complet de « Enregistrements, champs et séparateurs personnalisés dans awk » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours DevOps Bootcamp, passe à CoddyKit PRO. Le cours DevOps Bootcamp comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Enregistrements, champs et séparateurs personnalisés dans awk » ?

Contrôlez les séparateurs de champs d’entrée et de sortie pour découper les lignes CSV, TSV et de journaux en colonnes claires. Tu pratiques DevOps Bootcamp avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer DevOps Bootcamp ?

Aucune expérience préalable n'est requise. DevOps Bootcamp sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.

Combien de temps prend la leçon « Enregistrements, champs et séparateurs personnalisés dans awk » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon DevOps Bootcamp ?

Oui. Chaque leçon DevOps Bootcamp inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Enregistrements, champs et séparateurs personnalisés dans awk
  2. Motifs, plages et blocs BEGIN/END
  3. Agrégation avec les tableaux et le regroupement dans awk
  4. Fonctions awk, mise en forme avec printf et génération de rapports
← Retour à DevOps Bootcamp