English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Commande awk Linux

大全 command Linux

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.

Syntaxe

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.

Utilisation de base

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 $

Matching de chaînes de caractères par expression régulière

# 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

pattern inverse

$ 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

script awk

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

some examples

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")'

大全 command Linux