utilisation de combat maladroite

Travailler ensemble pour créer et grandir ensemble ! C'est le 34ème jour de ma participation au "Nuggets Daily New Plan · August Update Challenge", cliquez pour voir les détails de l'événement

Il y a eu une nouvelle très intéressante récemment. L'expert en informatique de 80 ans, Brian Kernighan, également connu sous le nom de K dans K & R, contribue toujours au code d'awk et ajoute la prise en charge d'Unicode. Veuillez consulter le contexte détaillé et l'interview originale .

J'ai honte de le dire, j'ai utilisé awk plusieurs fois, intentionnellement ou non, au cours des dernières années, mais j'oublie toujours de l'utiliser, j'oublie de le vérifier à nouveau et je ne l'ai jamais systématiquement trié. Profitez-en pour revoir le positionnement et l'usage courant de awk, un outil classique, similaire à grep, sed, sort, curl, etc.

Aujourd'hui, nous allons d'abord passer en revue awk .

ok

Dans les systèmes de type Unix, awk est un outil intégré, qui est généralement utilisé pour le filtrage de données, le traitement de texte, et similaire à sed et grep, il s'agit essentiellement d'un filtre de filtrage.

L'outil awk définit son propre langage de script pour traiter les données textuelles via une série d'actions. Si vous êtes intéressé, vous pouvez vous référer au Guide de l'utilisateur de GNU Awk pour la documentation complète .

awk ne nécessite pas de compilation et permet aux utilisateurs d'utiliser des variables, des fonctions numériques, des fonctions de chaîne et des opérateurs logiques. Avec son aide, les développeurs peuvent écrire des scripts très sophistiqués mais efficaces, définir un ensemble de modèles de recherche de texte et trouver l'action à exécuter ensuite.

De nombreux étudiants s'intéressent davantage à la raison pour laquelle un tel outil s'appelle awk. En fait, sa signification est le nom des trois fondateurs de la montagne :

Ohé, Weinberger, Kernighan

Analyse des capacités

Que pouvons-nous faire avec awk ?

  1. Scannez le contenu du fichier ligne par ligne ;
  2. Divisez la ligne de données d'entrée en plusieurs champs ;
  3. Correspondance de modèles sur les données d'entrée ;
  4. 针对匹配的行做一些操作(action)。

基本语法

awk 命令的格式如下:

awk options 'selection _criteria {action }' input-file > output-file
复制代码

事实上如果大家忘记了,直接在自己的 mac 或者 linux 上运行 awk,就会出现帮助提示:

$ awk

usage: awk [-F fs] [-v var=value] [-f progfile | 'prog'] [file ...]
复制代码

这里提供了两个选项

-f program-file : Reads the AWK program source from the file 
                  program-file, instead of from the 
                  first command line argument.
-F fs            : Use fs for the input field separator
复制代码

实战用法

假定我们有一个 employee.txt 文件,内容如下:

ajay manager account 45000
sunil clerk account 25000
varun manager sales 50000
amit manager account 47000
tarun peon sales 15000
deepak clerk sales 23000
sunil peon sales 13000
satvik director purchase 80000 
复制代码

awk 默认会打印指定文件里所有行:

$ awk '{print}' employee.txt
复制代码

此时因为没有提供需要匹配的模式,所以这个 print action 对于所有行都适用,并且 print action 如果没有参数就会默认打印一行里的所有内容。

所以运行上面命令,会打印出来原本的文本内容

ajay manager account 45000
sunil clerk account 25000
varun manager sales 50000
amit manager account 47000
tarun peon sales 15000
deepak clerk sales 23000
sunil peon sales 13000
satvik director purchase 80000 
复制代码

ok,如果只是这样就太鸡肋了,我们的 employee.txt 的特征还是很明显的,可以分析出来文本的第一列是员工姓名,第二列看起来是职位。

现在我们希望过滤出来所有 manager,可以这样运行:

$ awk '/manager/ {print}' employee.txt 
复制代码

此时会打印

ajay manager account 45000
varun manager sales 50000
amit manager account 47000 
复制代码

前面是匹配的模式,后面 {} 中的则是具体的 action。

除了模式能够调整外,action 也是可以调整的,如果我们不希望用 print 默认的行为,现在想将一行 split 成多个 field 怎么办?

awk 默认会根据空格来 split 每一行数据,并将每个 field 存储在 n dans ces variables. Par exemple, une ligne a 4 个单词,那么分隔后的结果将会被存储在 n 这些变量中。比如一行有 4 个单词,那么分隔后的结果将会被存储在 1, 2 , 2, 3, 4 这四个变量中。注意, 4 这四个变量中。注意, 0 代表了整个行。

所以,如果我们想基于 employee.txt 打印出来各个员工的名字和薪资(最后一列),可以这样做:

$ awk '{print $1,$4}' employee.txt 
复制代码

此时会打印出来:

ajay 45000
sunil 25000
varun 50000
amit 47000
tarun 15000
deepak 23000
sunil 13000
satvik 80000 
复制代码

第一列,第四列,完美符合预期。

除了上面我们提到的 $n 这些变量外,awk 还提供了一些内置的变量供开发者使用:

NR

NR command keeps a current count of the number of input records. Remember that records are usually lines. Awk command performs the pattern/action statements once for each record in a file.

NR 即 Number of Record, 记录了当前已经计数过的 record(行)数量。比如下面的命令:

$ awk '{print NR,$0}' employee.txt 
复制代码

此时会你会看到前面加上了行号:

1 ajay manager account 45000
2 sunil clerk account 25000
3 varun manager sales 50000
4 amit manager account 47000
5 tarun peon sales 15000
6 deepak clerk sales 23000
7 sunil peon sales 13000
8 satvik director purchase 80000 
复制代码

这里我们也可以加一些分隔符,比如打印编号 + 第一列,用- 来隔开,就可以这样:

$ awk '{print NR "-" $1 }' employee.txt
复制代码

得到的输出如下:

1-ajay
2-sunil
3-varun
4-amit
5-tarun
6-deepak
7-sunil
8-satvik
复制代码

当然,我们还可以活用 NR 来输出指定行:

$ awk 'NR==3, NR==6 {print NR,$0}' employee.txt 
复制代码

这样的命令代表了我们要打印 3 - 6 行这个区间内的行,输出如下:

3 varun manager sales 50000
4 amit manager account 47000
5 tarun peon sales 15000
6 deepak clerk sales 23000 
复制代码

有时候我们想打印出来一个文件的行号,就可以取最后一行的 NR,此时所有行都计数过了,所以 NR 等价于总行数:

$ awk 'END { print NR }' employee.txt 
复制代码

这里运行结果为 8,符合预期。

NF

NF command keeps a count of the number of fields within the current input record.

NF 即 Number of Field,记录了当前输入的 record 列的数量,我们可以用 $NF 来代表最后一列。

$ awk '{print $1,$NF}' employee.txt 
复制代码

运行之后,我们看到此时打印的是第一列和最后一列

ajay 45000
sunil 25000
varun 50000
amit 47000
tarun 15000
deepak 23000
sunil 13000
satvik 80000 
复制代码

NR + NF

现在我们有了 NR 和 NF,可以联系起来做什么呢?

比如此时我们希望找到空行的行号,假设有一些行就是没数据,是空的,怎么打印?

为了测试,我在第五行加了个空行,变成了这样:

ajay manager account 45000
sunil clerk account 25000
varun manager sales 50000
amit manager account 47000

tarun peon sales 15000
deepak clerk sales 23000
sunil peon sales 13000
satvik director purchase 80000
复制代码

其实很简单,空行的 NF 一定为 0,打印行号可以用 NR,所以我们可以这样:

$ awk 'NF==0 {print NR}' employee.txt
复制代码

运行后结果是 5,符合预期。

length

awk 提供了 length 函数计算字符串长度,比如我们希望找到所有比 80 个字符还长的行,可以这样:

awk 'length($0) > 80' employee.txt
复制代码

可能有些同学不理解,这里为啥不加 print 呀?

En fait, vous pouvez l'essayer et vous pouvez l'imprimer sans l'ajouter, car l'action par défaut est l'impression.

Utiliser une instruction if comme modèle

Parfois, nous voulons faire correspondre la valeur d'une certaine colonne. Supposons que nous voulions trouver la ligne où la valeur de la troisième colonne est égale aux ventes, ce qui peut être fait comme ceci :

$ awk '{ if($3 == "sales") print $0;}' employee.txt
复制代码

Imprimez le résultat après l'exécution :

varun manager sales 50000
tarun peon sales 15000
deepak clerk sales 23000
sunil peon sales 13000
复制代码

Calculs numériques

Parfois, nous n'avons pas nécessairement de fichier source, mais voulons directement construire les conditions dans la boucle for. Vous pouvez vous référer à cet exemple :

$ awk 'BEGIN { for(i=1;i<=6;i++) print "square of", i, "is",i*i; }' 
复制代码

Ici, vous constaterez que nous n'avons pas fourni le paramètre du fichier source, mais fourni une boucle for directement dans le modèle, et affichons les valeurs suivantes pour l'intervalle i = 1 à 6. Résultat de sortie :

square of 1 is 1
square of 2 is 4
square of 3 is 9
square of 4 is 16
square of 5 is 25
square of 6 is 36
复制代码

Il n'y a pas d'action par défaut pour les règles BEGIN et END, nous devons fournir une action explicite print.

sommaire

Aujourd'hui, nous avons passé en revue les concepts de base d'awk, combinés à quelques cas pratiques pour comprendre l'utilisation courante d'awk, ceux-ci sont loin d'être tous, awk fournit un ensemble complet de langages pour le traitement de texte.

Ce que nous énumérons ici n'est que la pointe de l'iceberg.Si vous êtes intéressé, veuillez vous référer au Guide de l'utilisateur pour une étude approfondie, qui sera d'une grande utilité pour le traitement de texte.

Merci d'avoir lu!

Je suppose que tu aimes

Origine juejin.im/post/7136957973674328072
conseillé
Classement