embarrassant
concept bizarre :
Awk est l'outil de texte le plus puissant, et il fonctionne également par ligne. Une fois que vous avez fini d'opérer sur la ligne, vous pouvez sélectionner la colonne de la ligne en fonction de la commande spécifiée.
Délimiteur d'Awk : le délimiteur par défaut d'awk est un espace ou une touche de tabulation (plusieurs espaces seront automatiquement compressés en un seul)
Format d'utilisation : fichier d'option awk 'modèle/condition{action}'
Opération : la valeur par défaut est d'imprimer (imprimer plusieurs colonnes plus ; 0 $ imprimer tout)
options courantes
-F : Spécifiez le délimiteur, si c'est un espace, vous n'avez pas besoin d'ajouter F
-v : affectation de variables
Awk variable intégrée
$0 couramment utilisée : imprimer tout le contenu
$n : la première colonne de la ligne à traiter
NR : le numéro de ligne de la ligne traitée
NF : le nombre de champs à traiter la ligne en cours, $NF signifie le dernier champ
FS : délimiteur de colonne, délimiteur du texte spécifié et le même effet que F. FS doit utiliser "" (guillemets doubles)
OFS : délimiteur pour le texte de sortie
RS : spécifiez le délimiteur sous forme de retour chariot
Remarque : ajoutez $ à la variable intégrée $n et n'avez pas besoin d'ajouter $ aux autres variables intégrées, encore moins aux guillemets et aux crochets, sinon elles seront traitées comme des chaînes.
Imprimer :
awk '{ $1}' test.txt #imprimer la première colonne
awk '{print $1,$2,$3}' test.txt #imprimer la première, la deuxième et la troisième colonne
awk '{ print $0}' test.txt # $0 consiste à imprimer tout le contenu
awk '{print NR}' test.txt #Imprime uniquement le numéro de ligne
awk '{print NR,$0}' test.txt #Imprime le numéro de ligne et affiche tout le contenu
Rechercher et imprimer :
awk 'NR==3{print}' test.txt #Spécifiez la troisième ligne à imprimer
awk 'NR==1,NR==3{print}' test.txt #imprimer la première ligne sur la troisième ligne
awk 'NR==1;NR==3{print}' test.txt #Imprimer les première et troisième lignes
Impression de parité :
awk 'NR%2==0 {print}' test.txt #Imprimer les lignes paires
awk 'NR%2==1 {print}' test.txt #imprimer les lignes impaires
opération awk (format fixe) :
Les opérations décimales sont prises en charge par défaut (** et ^ représentent une exponentiation)
La fonction intégrée d'Awk : getline
1. S'il n'y a pas de symbole de redirection (<,>) ou (|) sur les côtés gauche et droit de getline, awk lira d'abord la première ligne, mais si getline est ajouté, il ignorera la première ligne et lira la seconde. doubler
awk '{getline;print}' test.txt #Équivalent à l'impression en ligne paire
awk '{print;getline}' test.txt #Équivalent à l'impression de lignes impaires
2. S'il y a des caractères de redirection ou de canal des deux côtés, getline agit sur le fichier d'entrée dirigé
awk '{getline < « test1.txt »;print>« test2.txt »}' test1.txt
awk filtrage de texte (similaire à grep) :
awk '/^root/{print}' /etc/passwd #lignes commençant par root
awk '/bash$/{print}' /etc/passwd #lignes se terminant par bash
Comment obtenir le nombre de lignes dans le contenu du fichier via awk ?
Expressions ternaires : similaires à Java
Format de commande d'expression ternaire : awk '(expression conditionnelle) ? (Expression ou valeur A) : (expression ou valeur B)'
Imprimez les lignes 1 à 6, si la troisième colonne est supérieure à la quatrième colonne, affichez la troisième colonne, sinon affichez la quatrième colonne
Combiner la déduplication
awk '{a[$1]++};END{for (i in a){print i,a[i]}}'
Mode DÉBUT
awk 'BEGIN{..};{..};END{..}'file #Avant d'opérer sur le fichier, la condition du mode BEGIN{..} ou l'opération de commande sera exécutée en premier. Le {..} au milieu est la véritable commande de traitement des fichiers ;
Enfin, END{..} est une instruction de fin, qui imprime généralement le résultat de l'exécution.
Par exemple : awk 'BEGIN{i=0};{i++};END{print i}' /etc/passwd #imprimer le nombre total de lignes dans /etc/passwd
awk prend en charge l'impression de jugement conditionnel
Jugement conditionnel : $$(et) || (ou)
#Imprimer la sixième colonne est /home/test1 ou la septième colonne est /bin/bash
Le filtre précis d'Awk
>;<;= pour comparer les valeurs
$n~ "string" : indique que le nième champ contient un mot
$n ! ~ "string": indique que le nième champ ne contient pas un certain caractère
$n=="string" : Indique que le nième champ est un certain caractère
$n ! ="string": Indique que le nième champ n'est pas un certain caractère
$NF : dernier champ
awk combiné avec des tableaux à utiliser
Définir un tableau : awk 'BEGIN{a[0]=10;a[1]=20;a[2]=30; print a[1]}'
Exemple :
awk -F : '$7~"bash" {print $1,$NF}' /etc/passwd #La septième colonne contient bash, imprime le premier champ et le dernier champ
awk -F : '($6=="/home/my")&&($7=="/bin/bash"){print $1,$NFS}' /etc/passwd
awk -F : '($6=="/home/my")||($7=="/bin/bash"){print $1,$NFS}' /etc/passwd
awk -F : '($3!=0)||($4>10){print $1}' /etc/passwd