commande awk Linux
commande awk Linux
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