awk 'BEGIN { commands } PATTERN { commands } END { commands }'
begin块 body块 end块
- begin/end est sensible à la casse et les majuscules sont valides.
- Les espaces sont facultatifs.
- 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.