Notes de commande Awk

awk 'BEGIN { commands } PATTERN { commands } END { commands }'
     begin块               body块                 end块
  1. begin/end est sensible à la casse et les majuscules sont valides.
  2. Les espaces sont facultatifs.
  3. Les variables intégrées doivent être capitalisées.

Processus d'exécution :
1) Exécutez d'abord le bloc de début.
Équivalent à l'initialisation de la boucle.
2) Pour chaque enregistrement d'entrée, exécutez le bloc de corps.
Équivalent à l'exécution du corps de la boucle.
S'il traite du texte multiligne, la valeur par défaut consiste à diviser l'enregistrement avec un caractère de saut de ligne, c'est-à-dire à parcourir chaque ligne pour le traitement.
3) Traitement par défaut pour chaque enregistrement (chaque ligne de texte) :
séparez les champs de chaque ligne par un délimiteur (la valeur par défaut est un espace), et attribuez des valeurs à $1, $2... ($0 représente la ligne entière) à traiter
chaque champ selon les besoins, la sortie, etc.
4) Une fois la boucle terminée, exécutez le bloc de fin.

pattern pattern :
1) /expression régulière/ : /some string/
2) expression relationnelle : $2>10 NR%2==0
3) expression de correspondance de modèle : ~ ~!
4) intervalle de plage :
'NR==1, NR==10'1-10 lignes

$ cat /tmp/test.log 
2023-05-18 05:08:56.965846   460  4936 I SOMEIP  : 2023-05-18 05:08:56.871641 [info] [TID:571]  repetitionsBaseDelay_ = 100
2023-05-18 05:08:56.965863   460  4936 I SOMEIP  : 2023-05-18 05:08:56.871645 [info] [TID:571]  repetitionsMax_ = 3
2023-05-18 05:08:30.896556  1538  1538 I SettingsIFImpl: line 1
2023-05-18 05:08:30.896556  1538  1538 I SettingsIFImpl: line 2

# 包含SOMEIP的行
$ awk '/SOMEIP/' /tmp/test.log
2023-05-18 05:08:56.965846   460  4936 I SOMEIP  : 2023-05-18 05:08:56.871641 [info] [TID:571]  repetitionsBaseDelay_ = 100
2023-05-18 05:08:56.965863   460  4936 I SOMEIP  : 2023-05-18 05:08:56.871645 [info] [TID:571]  repetitionsMax_ = 3

# 不包含SOMEIP的行
$ awk '!/SOMEIP/' /tmp/test.log
2023-05-18 05:08:30.896556  1538  1538 I SettingsIFImpl: line 1
2023-05-18 05:08:30.896556  1538  1538 I SettingsIFImpl: line 2

# 把字段$6匹配模式的行,打印每行中$6后续内容
$ awk 'BEGIN{ ORS=" " } $6~/SOMEIP/{ for(i=8; i<=NF; i++) { print $i } print "\n" }' /tmp/test.log
2023-05-18 05:08:56.871641 [info] [TID:571]  repetitionsBaseDelay_ = 100 
 2023-05-18 05:08:56.871645 [info] [TID:571]  repetitionsMax_ = 3 
 2023-05-18 05:08:56.871641 [info] [TID:571]  repetitionsBaseDelay_ = 100 
 2023-05-18 05:08:56.871645 [info] [TID:571]  repetitionsMax_ = 3 

variables intégrées

FILENAME: 当前文件名
NR: 表示所有处理文件已处理的输入记录个数
FNR: 文件的当前记录数
NF: 表示数据文件中数据字段的个数,可以通过$NF获取最后一个数据字段
ARGC: 命令行参数个数
ARGV: 命令行参数数组
$0: 这个变量包含执行过程中当前行的文本内容。
$n: 一行记录的第n个字段,例如$1, $2

FS:输入字段分隔符
OFS:输出字段分隔符
RS:输入记录分割符
ORS:输出字段分隔符
FIELDWIDTHS:定义数据字段的宽度
$ awk '{print FILENAME, NF, $0}' /tmp/test.log 
/tmp/test.log 8 2023-05-18 05:08:30.896556  1538  1538 I SettingsIFImpl: line 1
/tmp/test.log 8 2023-05-18 05:08:30.896556  1538  1538 I SettingsIFImpl: line 2

$ awk '{print FILENAME "line>>" NR, $0}' /tmp/test.log 
/tmp/test.logline>>1 2023-05-18 05:08:30.896556  1538  1538 I SettingsIFImpl: line 1
/tmp/test.logline>>2 2023-05-18 05:08:30.896556  1538  1538 I SettingsIFImpl: line 2

bloc corps :

/pattern/ {
    
     commands }

1) Les enregistrements correspondant au modèle d'expression régulière exécutent des commandes.
2) Il peut y avoir plusieurs modèles correspondants, par exemple :
(1) Lorsque le modèle 1 correspond, la commande 1 est exécutée. Si pattern2 est trouvé, les commandes2 seront exécutées.
(2) La fonction de next est d'ignorer la correspondance de pattern suivante et les commandes (similaire à la relation if/else) ; s'il n'y a pas de commande next, chaque pattern matching sera jugé.

/patten1/ {
    
    commands1; next} /pattern2/ {
    
    commands2}

3) Si {commandes} est omis, print $0 est exécuté par défaut. Seul le filtrage /pattern/ matching est effectué.
(1) Pour les chaînes simples, dégénérer en grep.
(2) Utilisez des variables et des expressions intégrées pour effectuer des recherches complexes (filtrage), telles que le filtrage des lignes paires.

$ awk '/Max/' /tmp/test.log 
$ awk 'NR%2==0' /tmp/test.log

4) La fonction d'impression peut rediriger la sortie vers un fichier ou un pipeline dans les commandes

awk 'NR%2==0 { print $1 > "/tmp/part.log" }' /tmp/test.log

Chaque bloc de commande :
1) Plusieurs instructions peuvent être écrites. Une commande par ligne, pas de point-virgule à la fin. Plusieurs commandes peuvent également être séparées par des points-virgules.
2) Prise en charge de if-else, for, while et d'autres structures de contrôle.
3) Prend en charge les données, l'index peut être un nombre ou une chaîne, ce qui équivaut à une carte.
4) Fonctions personnalisables
function find_min(num1, num2) { if (num1 < num2) return num1 return num2 }
5) Fonctions intégrées :
(1) Fonctions mathématiques : sin, cos, log, sqrt, int, rand
(2) Fonctions de chaîne : gsub, sub, substr, index, length, match, split, tolower , toupper, sprintf, strtonum
sub(reg, str [, target])
a) Chaîne correspondant à reg, remplacée par str.
b) cible est la chaîne cible de remplacement, la valeur par défaut est 0, elle peut être spécifiée en tant que table ou champ 0, et elle peut être spécifiée en tant que table ou champ0 , qui peut être spécifié comme une table ou un champ n.
c) gsub est identique au prototype de sub, remplaçant toutes les chaînes qui correspondent à reg, et sub ne remplace que la première occurrence.
gensub(reg, str, h [, target])
a) h peut spécifier le nombre d'occurrences de reg à remplacer, ou "g/G" pour tout remplacer.
b) Dans str, "\n" peut être utilisé pour faire référence à la position où reg apparaît.
print
(3) Fonctions de temps : mktime, strftime, systime
(4) Fonctions d'opération sur les bits : and, or, xor, compl, lshift, rshift
(5) Autres fonctions : close, flush, exit, delete, getline, next, nextfile, système de retour

# sub,gsub例子
# sub
$ cat /tmp/test.log 
2023-05-18 05:08:56.965846   460  4936 I SOMEIP  : 2023-05-18 05:08:56.871641 [info] [TID:571] client_timer_18215_1 repetitionsBaseDelay_ = 100
2023-05-18 05:08:56.965863   460  4936 I SOMEIP  : 2023-05-18 05:08:56.871645 [info] [TID:571] client_timer_18215_1 repetitionsMax_ = 3

#sub函数只替换第一次出现的字符串
$ awk '{ sub(/2023-05-18/, "1234-56-78"); print $0 }' /tmp/test.log 
1234-56-78 05:08:56.965846   460  4936 I SOMEIP  : 2023-05-18 05:08:56.871641 [info] [TID:571] client_timer_18215_1 repetitionsBaseDelay_ = 100
1234-56-78 05:08:56.965863   460  4936 I SOMEIP  : 2023-05-18 05:08:56.871645 [info] [TID:571] client_timer_18215_1 repetitionsMax_ = 3

#gsub函数替换一行中所有匹配的字符串
$ awk '{ gsub(/2023-05-18/, "1234-56-78"); print $0 }' /tmp/test.log 
1234-56-78 05:08:56.965846   460  4936 I SOMEIP  : 1234-56-78 05:08:56.871641 [info] [TID:571] client_timer_18215_1 repetitionsBaseDelay_ = 100
1234-56-78 05:08:56.965863   460  4936 I SOMEIP  : 1234-56-78 05:08:56.871645 [info] [TID:571] client_timer_18215_1 repetitionsMax_ = 3

# gsub删除收尾空格
$ awk '{gsub(/^ +| +$/,"")} {print "=" $0 "="}' onefile.txt

Diviser les enregistrements avec plusieurs délimiteurs :

$ cat test.log
2023-05-18 05:08:56.965846   460  4936 I SOMEIP

# 用空格、.、:多个分隔符来拆分记录,默认只用空格分隔符
$ awk -F "[ .:]" '{print $1,$2,$3,$4,$5}' test.log 
2023-05-18 05 08 56 965846

# FS和-F参数等效
$ awk 'BEGIN{FS="[ .:]"} {print $1,$2,$3,$4,$5}' test.log 
2023-05-18 05 08 56 965846

Les variables personnalisées
1) sont plus utiles pour les scripts, mais pas très utiles dans la ligne de commande.
2) Sur la ligne de commande, les variables personnalisées sont écrites après les instructions du script. Les instructions du script sont à côté de awk.

$ awk '{ print name"="age }' name=tom age=12 /tmp/test.log 
tom=12
tom=12

Tableau :
1) Tableau associatif, type carte.
2) Pas besoin de définir d'abord
3) La boucle for...in peut être hors service, tandis que la boucle for (i=1...) est en ordre

$ awk '
BEGIN {
str="this is a string"; 
len=split(str, array, " "); 
print length(array), len; 
for (i in array) 
	print i": "array[i]; 
}'

4 4
1: this
2: is
3: a
4: string

$ awk 
'BEGIN {
str="this is a string"; 
len=split(str, array, " "); 
print length(array), len; 
for (i=1; i<=len; i++) 
	print i": "array[i]; 
}'
4 4
1: this
2: is
3: a
4: string

$ awk 
'BEGIN{ 
arr["one"]=1; 
arr["two"]=2; 
arr["three"]=3; 

for (item in arr) 
	print item"->"arr[item] 
}'
three->3
two->2
one->1

Contrôle de processus:

$ cat /tmp/file.txt 
line 1
line 2
line 3
line 4
line 5
line 6

# if
$ awk '{ 
if (NR % 2 == 0) 
{
	print $0
} 
else if (NR %3 == 0) 
{
	print $0
} 
}' /tmp/file.txt 

line 2
line 3
line 4
line 6

# while 循环
$ awk 'BEGIN{ 
count=3; 
while (count>0) 
{
	print count; 
	count--;
} 
}' /tmp/file.txt 
3
2
1

# for循环
$ awk 'BEGIN{ 
for(count=3; count>0; count--) 
{
	print count;
} 
}' /tmp/file.txt 
3
2
1

commandes de contrôle :

break,退出while/for循环
continue,继续下一次循环
next,继续系一条记录,把body块作为循环体,next类似continue,跳到下一条记录。
exit, 在body块中exit,结束body块循环,执行END;在END中exit,退出程序。包body块作为循环体,exit类似break。

Exemple de calcul numérique :


$ cat /tmp/num.txt
1
2
3
4
5
# 计算均值
$ awk 'BEGIN{ sum=0; } { sum+=$1; } END{ print sum/NR }' /tmp/num.txt 
3

$ cat /tmp/num.txt
1 2 3 4 5
11 22 33 44 55
10 20 30 40 50
# 计算均值
$ awk '{ sum=0; for(i=1; i<=NF; i++) sum+=$i; print sum/NF }' /tmp/num.txt 
3
33
30


Awk peut personnaliser des fonctions, qui ne sont pas utilisées pour le moment, et ne seront pas enregistrées.

Je suppose que tu aimes

Origine blog.csdn.net/yinminsumeng/article/details/130618023
conseillé
Classement