Latest web development tutorials

commande awk Linux

commande awk Linux

Linux commande Daquan Linux commande Daquan

AWK est un traitement de la langue des fichiers texte, analyse de texte est un outil puissant.

AWK a été appelé parce qu'il a fallu trois fondateurs Alfred Aho, Peter Weinberger, et Brian Kernighan du nom de famille du premier caractère.

grammaire

awk [选项参数] 'script' var=value file(s)
或
awk [选项参数] -f scriptfile var=value file(s)

Paramètre Options Description:

  • -F Fs ou fs --field-séparateur
    Spécification fichier une entrée hors séparateur, fs est une chaîne ou une expression régulière, comme -F:.
  • -v var = valeur ou --asign var = valeur
    Affecter une variable définie par l'utilisateur.
  • scripfile -f ou --file fichierscript
    commande Awk lu à partir d'un fichier de script.
  • -mf nnn et -mr nnn
    valeur Nnn des limites inhérentes, le nombre maximal de blocs nnn limites d'options attribuées -MF; option limite le nombre maximum -mr enregistrement. Ces deux caractéristiques sont la version Bell Labs d'extensions awk dans la awk norme ne sont pas applicables.
  • -W Compact ou --compat, -W traditionnel ou --traditional
    Exécution en mode de compatibilité awk. Donc gawk comportement et exactement le même awk standard, awk toutes les extensions sont ignorées.
  • -W Copyleft ou --copyleft, copyright -W ou --copyright
    Imprimer de brèves informations de droit d'auteur.
  • Aide -W ou --help, utilisation -W ou --usage
    Imprimer une brève description de l'ensemble des options de awk et chaque option.
  • -W Lint ou --lint
    Imprimer avertissements pas à la structure du portage traditionnel unix.
  • -W Lint-vieux ou --lint-old
    L'impression ne peut pas être transplanté sur unix structure de la plate-forme d'avertissement traditionnelle.
  • -W Posix
    Activer le mode de compatibilité. Avec les restrictions suivantes, ne reconnaît pas: / x, touche de fonction, func, les séquences d'échappement, et quand fs est un espace, la nouvelle ligne comme séparateur de champ, les opérateurs ** et ** = ne peut pas remplacer ^ et ^ =; fflush invalide.
  • -W Re-interval ou --re-inerval
    Autoriser les expressions d'intervalle dans une utilisation régulière, référence (grep dans les classes de caractères Posix), comme support des expressions [[: alpha:]].
  • -W Source programme-texte ou programme texte --source
    Utilisez le programme de texte sous forme de code source, il peut être mélangé avec la commande -f.
  • -W Version ou --version
    Version imprimable bug reporting information.

Utilisation de base

texte log.txt se lit comme suit:

2 this is a test
3 Are you like awk
This's a test
10 There are orange,apple,mongo

Utilisez un:

awk '{[pattern] action}' {filenames}   # 行匹配语句 awk '' 只能用单引号

exemple:

# 每行按空格或TAB分割,输出文本中的1、4项
 $ awk '{print $1,$4}' log.txt
 ---------------------------------------------
 2 a
 3 like
 This's
 10 orange,apple,mongo
 # 格式化输出
 $ awk '{printf "%-8s %-10s\n",$1,$4}' log.txt
 ---------------------------------------------
 2        a
 3        like
 This's
 10       orange,apple,mongo
 

Usage II:

awk -F  #-F相当于内置变量FS, 指定分割字符

exemple:

# 使用","分割
 $  awk -F, '{print $1,$2}'   log.txt
 ---------------------------------------------
 2 this is a test
 3 Are you like awk
 This's a test
 10 There are orange apple
 # 或者使用内建变量
 $ awk 'BEGIN{FS=","} {print $1,$2}'     log.txt
 ---------------------------------------------
 2 this is a test
 3 Are you like awk
 This's a test
 10 There are orange apple
 # 使用多个分隔符.先使用空格分割,然后对分割结果再使用","分割
 $ awk -F '[ ,]'  '{print $1,$2,$5}'   log.txt
 ---------------------------------------------
 2 this test
 3 Are awk
 This's a
 10 There apple

Utilisez trois:

awk -v  # 设置变量

exemple:

 $ awk -va=1 '{print $1,$1+a}' log.txt
 ---------------------------------------------
 2 3
 3 4
 This's 1
 10 11
 $ awk -va=1 -vb=s '{print $1,$1+a,$1b}' log.txt
 ---------------------------------------------
 2 3 2s
 3 4 3s
 This's 1 This'ss
 10 11 10s

Utilisez quatre:

awk -f {awk脚本} {文件名}

exemple:

 $ awk -f cal.awk log.txt

opérateurs

opérateurs description
= + = - = * = / =% = ^ = ** = affectation
?: C expression conditionnelle
|| logique ou
&& logique et
~ ~! Faites correspondre l'expression régulière ne correspond pas à l'expression régulière
<< = >> =! = == opérateurs relationnels
blanc raccordement
+ - Addition, soustraction
* / & Multiplication, division et le reste
+ -! Plus unaire, moins, et la négation logique
^ *** Exponentiation
++ - Augmentation ou diminution, comme un préfixe ou un suffixe
$ références sur le terrain
dans membres Array

Filtrage de la première colonne de la ligne est supérieure à 2

$ awk '$1>2' log.txt    #命令
#输出
3 Are you like awk
This's a test
10 There are orange,apple,mongo

Filtrage de la première colonne de rang 2 égaux

$ awk '$1==2 {print $1,$3}' log.txt    #命令
#输出
2 is

Filtrage de la première ligne et la deuxième colonne est supérieure à 2 est égale à la colonne «Y» de

$ awk '$1>2 && $2=="Are" {print $1,$2,$3}' log.txt    #命令
#输出
3 Are you

Intégré dans les variables

variable description
$ \ N N-ième domaine de l'enregistrement en cours, séparés par FS entre les champs
\ $ 0 Complete enregistrement d'entrée
ARGC Le nombre de paramètres de ligne de commande
ARGIND Position sur la ligne de commande du fichier en cours (commencer à compter de 0)
ARGV Tableau contient les arguments de ligne de commande
CONVFMT Format tableau associatif de conversion numérique variable d'environnement ENVIRON (la valeur par défaut est% .6g)
ERRNO Enfin, une description d'erreur système
FIELDWIDTHS La largeur de la liste des champs (séparés par un espace)
FILENAME nom de fichier actuel
FNR Avec NR, mais par rapport au fichier actuel
FS Le séparateur de champs (par défaut tous les espaces)
IGNORECASE Si cela est vrai, le match de la casse
NF Le nombre de champs dans l'enregistrement en cours
NR Le nombre actuel de dossiers
OFMT Format de sortie numérique (par défaut% .6g)
BSF séparateur de champ de sortie (par défaut est un espace)
ORS Le séparateur d'enregistrements en sortie (par défaut est un saut de ligne)
RLENGTH La longueur du match par la chaîne de fonction de match
RS séparateur d'enregistrement (par défaut est un saut de ligne)
RSTART La première position est compensée par la chaîne de fonction de match
SUBSEP Séparateur Array indice (par défaut / 034)
$ awk 'BEGIN{printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n","FILENAME","ARGC","FNR","FS","NF","NR","OFS","ORS","RS";printf "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}'  log.txt
FILENAME ARGC  FNR   FS   NF   NR  OFS  ORS   RS
---------------------------------------------
log.txt    2    1         5    1
log.txt    2    2         5    2
log.txt    2    3         3    3
log.txt    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 "---------------------------------------------\n"} {printf "%4s %4s %4s %4s %4s %4s %4s %4s %4s\n",FILENAME,ARGC,FNR,FS,NF,NR,OFS,ORS,RS}'  log.txt
FILENAME ARGC  FNR   FS   NF   NR  OFS  ORS   RS
---------------------------------------------
log.txt    2    1    '    1    1
log.txt    2    2    '    1    2
log.txt    2    3    '    2    3
log.txt    2    4    '    1    4
# 输出顺序号 NR, 匹配文本行号
$ awk '{print NR,FNR,$1,$2,$3}' log.txt
---------------------------------------------
1 1 2 this is
2 2 3 Are you
3 3 This's a test
4 4 10 There are
# 指定输出分割符
$  awk '{print $1,$2,$5}' OFS=" $ "  log.txt
---------------------------------------------
2 $ this $ test
3 $ Are $ awk
This's $ a $
10 $ There $

Utilisez un correspondant régulier de chaîne

# 输出第二列包含 "th",并打印第二列与第四列
$ awk '$2 ~ /th/ {print $2,$4}' log.txt
---------------------------------------------
this a

~ Un schéma commence.// Est lemode.

# 输出包含"re" 的行
$ awk '/re/ ' log.txt
---------------------------------------------
3 Are you like awk
10 There are orange,apple,mongo

Ignorer la casse

$ awk 'BEGIN{IGNORECASE=1} /this/' log.txt
---------------------------------------------
2 this is a test
This's a test

mode niés

$ 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

le script awk

A propos de script awk, nous avons besoin de prêter attention à deux mots clés BEGIN et END.

  • BEGIN {il est mis avant d'exécuter les instructions}
  • END {Ceci est une déclaration qui a mis toutes les lignes après le traitement à exécuter}
  • {Ceci est un processus qui a mis l'instruction à exécuter pour chaque ligne}

Supposons qu'un tel document (table élève de réalisation):

$ 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 comme suit:

$ 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\n", $1, $2, $3,$4,$5, $3+$4+$5
}
#运行后
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
}

Nous examinons la mise en œuvre des résultats:

$ 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

D'autres exemples

AWK est un programme bonjour mondial:

BEGIN { print "Hello, world!" }

Taille fichier Calcul

$ ls -l *.txt | awk '{sum+=$6} END {print sum}'
--------------------------------------------------
666581

Pour en savoir d'un fichier plus grand que la longueur de la ligne 80

awk 'lenght>80' log.txt

Imprimer la table de multiplication

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

Des informations plus détaillées peuvent être consultés manuel officiel AWK: http://www.gnu.org/software/gawk/manual/gawk.html

Linux commande Daquan Linux commande Daquan