English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
AWK est un langage de traitement de fichiers texte, un outil puissant d'analyse de texte.
AWK s'appelle ainsi parce qu'il prend les initiales des noms de famille des trois fondateurs Alfred Aho, Peter Weinberger et Brian Kernighan.
awk [options] 'script' var=value fichier(s) ou awk [options] -f scriptfile var=value fichier(s)
Description des options :
-F fs ou --champ-délimiteur separator fs
Spécifiez le délimiteur de champ d'entrée fichier, fs est une chaîne ou une expression régulière, comme-F:.
-v var=value ou --asign var=value
Affectez une variable utilisateur définie.
-f scripfile ou --file scriptfile
Lisez les commandes awk à partir du fichier de script.
-mf nnn et -mr nnn
Définissez une restriction intrinsèque pour la valeur nnn,-L'option mf limite le nombre maximum de blocs alloués à nnn;-L'option mr limite le nombre maximum d'enregistrements. Ces deux fonctionnalités sont des extensions de la version awk du Bell Labs, qui ne s'appliquent pas dans awk standard.
-W compact ou --compat, -W traditional ou --traditional
Exécutez awk en mode compatible. Par conséquent, le comportement de gawk est identique à celui de awk standard, et toutes les extensions awk sont ignorées.
-W copyleft ou --copyleft, -W copyright ou --copyright
Imprimez des informations de copyright brèves.
-W help ou --help, -W usage ou --usage
Affiche toutes les options d'awk et une brève description de chaque option.
-W lint ou --lint
Affiche un avertissement concernant les structures qui ne peuvent pas être移植 vers des plateformes unix traditionnelles.
-W lint-ancien ou --lint-ancien
Affiche un avertissement concernant les structures qui ne peuvent pas être移植 vers des plateformes unix traditionnelles.
-W posix
Ouvrir le mode compatible. Mais il y a des restrictions, il ne reconnaît pas :/x, les mots-clés de fonction, func, les séquences d'échappement et lorsque fs est un espace, le nouveau ligne est utilisé comme séparateur de champ ; l'opérateur**et**= ne peut pas remplacer ^ et ^=;fflush est inefficace.
-W re-interval ou --re-interval
Permet l'utilisation de l'expression régulière interval, consultez (grep et les classes de caractères Posix), comme les expressions en parenthèses [[:alpha:]].
-W programme source-texte ou --programme source-texte
programme-texte en tant que code source, peut être utilisé avec-commande f mélangée.
-W version ou --version
Affiche la version du rapport d'erreur de bug.
Le contenu du fichier log.txt est le suivant:
2 this is a test 3 Are you like awk This's a test 10 There are orange,apple,mongo
用法一:
awk '{[pattern] action}' {filenames} # 行匹配语句 awk '' ne peut utiliser que des guillemets simples
示例:
# 每行按空格或TAB分割,输出文本中的1、4élément $ awk '{print $1$4}' log.txt --------------------------------------------- 2 a 3 comme Ceci est 10 orange,pomme,mongo # 格式化输出 $ awk '{printf "%-8s %-10s\n",$1$4}' log.txt --------------------------------------------- 2 a 3 comme Ceci est 10 orange,pomme,mongo
用法二:
awk -F #-F équivaut à la variable built-in FS, spécifie le caractère de séparation
示例:
# 使用","分割 $ awk -F, '{print $1$2}' log.txt --------------------------------------------- 2 this is a test 3 Are you like awk This's a test 10 Il y a des oranges et des pommes # 或者使用内建变量 $ awk 'BEGIN{FS=","} {print $1$2}' log.txt --------------------------------------------- 2 this is a test 3 Are you like awk This's a test 10 Il y a des oranges et des pommes # 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割 $ awk -F '[ ,]' '{print $1$2$5}' log.txt --------------------------------------------- 2 ce test 3 Il y a des awk Ceci est 10 Il y a une pomme
用法三:
awk -v # 设置变量
示例:
$ awk -va=1 '{print $1$1+a}' log.txt --------------------------------------------- 2 3 3 4 Ceci est 1 10 11 $ awk -va=1 -vb=s '{print $1$1+a,$1b}' log.txt --------------------------------------------- 2 3 2s 3 4 3s Ceci est 1 This'ss 10 11 10s
用法四:
awk -f {awk脚本} {文件名}
示例:
$ awk -f cal.awk log.txt
运算符 | 描述 |
---|---|
= += -= *= /= %= ^= **= | 赋值 |
?: | C条件表达式 |
|| | 逻辑或 |
&& | 逻辑与 |
~ 和 !~ | 匹配正则表达式和不匹配正则表达式 |
< <= > >= != == | 关系运算符 |
空格 | 连接 |
+ - | 加,减 |
* / % | 乘,除与求余 |
+ - ! | 一元加,减和逻辑非 |
^ *** | 求幂 |
++ -- | 增加或减少,作为前缀或后缀 |
$ | 字段引用 |
in | 数组成员 |
过滤第一列大于2的行
$ awk '$1>2' log.txt #命令 #输出 3 Are you like awk This's a test 10 There are orange,apple,mongo
过滤第一列等于2的行
$ awk '$1==2 {print "1$3}' log.txt #命令 #输出 2 is
过滤第一列大于2并且第二列等于'Are'的行
$ awk '$1>2 && $2=="Are" {print $1$2$3}' log.txt #命令 #输出 3 this is
变量 | 描述 |
---|---|
$n | 当前记录的第n个字段,字段间由FS分隔 |
$0 | 完整的输入记录 |
ARGC | 命令行参数的数目 |
ARGIND | 命令行中当前文件的位置(从0开始算) |
ARGV | 包含命令行参数的数组 |
CONVFMT | 数字转换格式(默认值为%.6g)ENVIRON环境变量关联数组 |
ERRNO | 最后一个系统错误的描述 |
FIELDWIDTHS | 字段宽度列表(用空格键分隔) |
FILENAME | 当前文件名 |
FNR | 各文件分别计数的行号 |
FS | 字段分隔符(默认是任何空格) |
IGNORECASE | 如果为真,则进行忽略大小写的匹配 |
NF | 一条记录的字段的数目 |
NR | 已经读出的记录数,就是行号,从1开始 |
OFMT | 数字的输出格式(默认值是%.6g) |
OFS | 输出字段分隔符,默认值与输入字段分隔符一致。 |
ORS | 输出记录分隔符(默认值是一个换行符) |
RLENGTH | 由match函数所匹配的字符串的长度 |
RS | 记录分隔符(默认是一个换行符) |
RSTART | 由match函数所匹配的字符串的第一个位置 |
SUBSEP | 数组下标分隔符(默认值是/034) |
$ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf ""--------------------------------------------- "} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS} s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt --------------------------------------------- FILENAME ARGC FNR FS NF NR OFS ORS RS 2 1 5 1 FILENAME ARGC FNR FS NF NR OFS ORS RS 2 2 5 2 FILENAME ARGC FNR FS NF NR OFS ORS RS 2 3 3 3 FILENAME ARGC FNR FS NF NR OFS ORS RS 2 4 4 4 $ awk -F' 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf ""--------------------------------------------- "} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS} s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}' log.txt --------------------------------------------- FILENAME ARGC FNR FS NF NR OFS ORS RS 2 1 log.txt 1 1 FILENAME ARGC FNR FS NF NR OFS ORS RS 2 2 log.txt 1 2 FILENAME ARGC FNR FS NF NR OFS ORS RS 2 3 log.txt 2 3 FILENAME ARGC FNR FS NF NR OFS ORS RS 2 4 log.txt 1 4 # Sortir le numéro d'ordre NR, numéro de ligne correspondante1$2$3}' log.txt --------------------------------------------- 1 1 2 $ awk '{print NR,FNR,$ 2 2 3 this is 3 3 This's a test 4 4 10 Are you There are # Définir le symbole de séparation de sortie1$2$5$ awk '{print " --------------------------------------------- 2 }' OFS=" $ " log.txt 3 $ this $ test $ Are $ awk 10 This's $ a $
# Sortir la deuxième colonne contenant "th", et imprimer la deuxième et la quatrième colonnes $ awk '$2 ~ /th/ {print "2$4}' log.txt --------------------------------------------- this a
~ signifie le début du pattern.// dans ce cas, c'est le pattern.
# Sortir les lignes contenant "re" $ awk '/re/ ' log.txt --------------------------------------------- 3 Are you like awk 10 There are orange,apple,mongo
$ awk 'BEGIN{IGNORECASE=1} /this/' log.txt --------------------------------------------- 2 this is a test This's a test
$ awk '$2 !~ /th/ {print "2$4}' log.txt --------------------------------------------- Are like a There orange,apple,mongo $ awk '!/th/ {print "2$4}' log.txt --------------------------------------------- Are like a There orange,apple,mongo
Sur le plan du script awk, il faut noter deux mot-clés : BEGIN et END.
BEGIN{ Ici, on place les instructions à exécuter avant l'exécution }
END {Ici, on place les instructions à exécuter après l'analyse de toutes les lignes}
{Ici, on place les instructions à exécuter pour chaque ligne}
Supposons qu'il y a un fichier de ce type ( tableau de notes des étudiants ):
$ cat score.txt Marry 2143 78 84 77 Jack 2321 66 78 45 Tom 2122 48 77 71 Mike 2537 87 97 95 Bob 2415 40 57 62
Notre script awk est le suivant :
$ cat cal.awk #!/bin/awk -f #运行前 BEGIN { math = 0 english = 0 computer = 0 printf "NAME NO. MATH ENGLISH COMPUTER TOTAL\n" printf ""---------------------------------------------\n" } #运行中 { math+=$3 english+=$4 computer+=$5 printf "%-6s %-6s %4d %8d %8d %8d\n1,2,3$4$5,3+$4+$5 } # run after END { printf ""---------------------------------------------\n" printf " TOTAL:%10d %8d %8d \n", math, english, computer printf "AVERAGE:%10.2f %8.2f %8.2f\n", math/NR, english/NR, computer/NR }
let's see execution result:
$ awk -f cal.awk score.txt NAME NO. MATH ENGLISH COMPUTER TOTAL --------------------------------------------- Marry 2143 78 84 77 239 Jack 2321 66 78 45 189 Tom 2122 48 77 71 196 Mike 2537 87 97 95 279 Bob 2415 40 57 62 159 --------------------------------------------- TOTAL: 319 393 350 AVERAGE: 63.80 78.60 70.00
program hello world AWK
BEGIN { print "Hello, world!" }
calculate size file
$ ls -l *.txt | awk '{sum+=$5}{END {print sum} -------------------------------------------------- 666581
find length greater than file 8line: 0
awk 'length>80' log.txt
print multiplication table nine nine
seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR ? "\n" : "\t")'