Y a-t-il encore une raison d'apprendre AWK?

109

J'apprends constamment de nouveaux outils, même les plus démodés, car j'aime utiliser la bonne solution pour le problème.

Néanmoins, je me demande s'il y a encore une raison d'en apprendre certains. awkpar exemple est intéressant pour moi, mais pour le traitement de texte simple, je peux utiliser grep, cut, sed, etc. tandis que pour les complexes, je vais pour Python.

Maintenant, je ne veux pas dire que ce n'est pas un outil puissant et pratique. Mais comme il faut du temps et de l'énergie pour apprendre un nouvel outil, en vaut-il la peine ?

e-satis
la source
2
nous sommes en 2019 et je viens de réécrire un normalisateur de journal python dans awk. J'ai exécuté la transformation sur une semaine de fichiers journaux qui étaient un fichier journal de 54 millions de lignes (~ 9 Go). Sur mon Macbook Pro (2,8 GHZ i7, 16 Go de RAM), la version python pouvait traiter ~ 10k lignes par seconde => 90 minutes d'exécution. En utilisant mawk, le temps d'exécution a été réduit à 2 minutes. Btw, le programme awk faisait la moitié de la taille.
mistahenry
@mistahenry avez-vous essayé pypy?
QWR

Réponses:

97

Je pense que cela dépend de l'environnement dans lequel vous vous trouvez. Si vous êtes une personne * nix, alors savoir awkest une bonne chose. Le seul autre environnement de script qui peut être trouvé sur pratiquement tous les * nix est sh. Ainsi, alors que grep, sed,etc. peut sûrement remplacer awksur une linuxdistribution traditionnelle moderne , lorsque vous passez à des systèmes plus exotiques, en savoir un peu awksera vraiment pratique.

awkpeut également être utilisé pour plus que le traitement de texte. Par exemple, l'un de mes superviseurs écrit du code d'astronomie awk- c'est à quel point il est complètement old school et génial . À son époque, c'était le meilleur outil pour le travail ... et maintenant, même si ses élèves comme moi utilisent python et autres, il s'en tient à ce qu'il sait et fonctionne bien.

En conclusion, il y a beaucoup de vieux codes qui circulent dans le monde, sachant qu'un peu awkne va pas faire de mal. Cela vous rendra également meilleur * personne nix :-)

espace libre
la source
12
++ D'accord, awk est vraiment l'un des outils les plus portables et surtout cohérents de l'ensemble d'outils * nix. Il fonctionne de manière fiable sur busybox, par exemple, où perl est introuvable.
canons
1
Et ce n'est vraiment pas si difficile à apprendre non plus si vous êtes habitué aux langages bouclés
pistolets
2
"C'est la même chose dans n'importe quel environnement" - pas tout à fait: sous Windows, les guillemets simples doivent être remplacés par des doubles, s et les doubles internes doivent être échappés. (Windows est une sorte d'environnement réel, même si vous exposer à l'atrocimité non sécurisée à moitié terminée de Redmond vous met à la merci de tout Russe de 15 ans).
GT.
6
Je ne pense pas que beaucoup de gens associent l'existence de awk et de fenêtres dans le même univers .....: P
FoldedChromatin
2
Toujours utiliser awk pour les travaux de traitement de texte. Je vais souvent commencer un script dans autre chose (ruby, python) et finir par revenir à awk pour la simplicité et la puissance.
Rumbleweed
104

Si vous apprenez rapidement les bases de awk, vous pouvez en effet faire des choses étonnantes sur la ligne de commande.

Mais la vraie raison d'apprendre awk est d'avoir une excuse pour lire le superbe livre The AWK Programming Language de ses auteurs Aho, Kernighan et Weinberger. On pourrait penser, d'après le nom, que cela vous apprend simplement à vous faire du mal. En fait, ce n'est que le début. Se lancer dans le vaste éventail de problèmes qui peuvent être résolus une fois que l'on utilise un langage de script concis qui facilite la manipulation des chaînes - et awk a été l'un des premiers - il continue à apprendre au lecteur comment implémenter une base de données, un analyseur, un interprète , et (si ma mémoire est bonne) un compilateur pour un petit langage informatique spécifique au projet! Si seulement ils avaient également programmé un exemple de système d'exploitation en utilisant awk, le livre aurait été une introduction assez complète à l'informatique!

Célèbre, clair et concis, comme le livre original en langage C, c'est aussi un merveilleux exemple d'écriture technique amicale bien faite. Même l'index est une pièce d'artisanat.

Awk? Si vous le connaissez, vous l'utiliserez occasionnellement en ligne de commande, mais pour tout ce qui est plus grand, vous vous sentirez piégé, incapable d'accéder aux fonctionnalités plus larges de votre système et d'Internet auxquelles quelque chose comme Python donne accès. Mais le livre? Vous serez toujours heureux de l'avoir lu!

Brandon Rhodes
la source
5
+1 Vendu. Je vais commander ce livre. J'ai utilisé awk pendant des années comme un langage de script rapide et puissant à une seule ligne. Awk est un excellent pré-processeur pour les fichiers qui prendraient autrement une douzaine de lignes à coder. Je ne peux pas compter le nombre de fois où j'ai utilisé le formulaire: awk '{print $ 1, $ 2}'
galaxywatcher
2
D'accord. Cela défie presque toute croyance à quel point ce livre est compact, étant donné tout ce qu'il contient. Il couvre plus que la plupart des livres contemporains en 1/10 (?) De la longueur.
terre battue
3
Je lis ce livre maintenant et il a enflammé mon enthousiasme pour awk à une quasi obsession.
galaxywatcher
3
Voir aussi l'excellent Gawk: Programmation AWK efficace .
lhf le
1
Je viens de lire le premier chapitre. C'est étonnant. Mistery résolu.
vaichidrewar
29

La seule raison pour laquelle j'utilise awkest le fractionnement automatique:

awk '{print $3}' < file.in

Cela imprime le troisième champ délimité par des espaces dans file.in. C'est un peu plus simple que:

tr -s ' ' < file.in | cut -d' ' -f3
Greg Hewgill
la source
3
pourquoi utiliser awk '{print $3}' < file.inau lieu de awk '{print $3}' file.in? Awk ne lit-il pas déjà les fichiers lorsqu'ils sont passés en arguments?
mbigras
@mbigras Bien sûr, vous pouvez utiliser awk de toute façon.
Greg Hewgill
Même avec doublesize, j'aime la solution non-awk. Et je ne sais pas pourquoi je déteste awk: /
MD. Mohiuddin Ahmed
25

Je pense que awk est génial si votre fichier contient des colonnes / champs . Je l'utilise lors du traitement / analyse d'une colonne particulière dans un fichier multicolonne. Ou si je souhaite ajouter / supprimer une ou plusieurs colonnes particulières.

par exemple

awk -F \t '{ if ($2 > $3) print; }' <filename>

ne s'imprimera que si la valeur de la 2e colonne dans un fichier séparé par tabulation est supérieure à la valeur de la 3e colonne.

Bien sûr, je pourrais utiliser Perl ou Python, mais awk le rend tellement plus simple avec une commande concise sur une seule ligne.

L'apprentissage de awk est également assez peu coûteux. Vous pouvez apprendre les bases de awk en moins d'une heure, donc ce n'est pas autant d'effort que d'apprendre tout autre langage de programmation / script.

Nikhil
la source
Bien que je n'utilise pas vraiment awk, c'est une excellente utilisation pour awk.
Paul Nathan
8

J'utilise occasionnellement AWK pour traiter du HTML. Par exemple, ce code convertit les tables en fichiers csv:

BEGIN {s=""; FS="n"}
/<td/ { gsub(/<[^>]*>/, ""); s=(s ", " $1);}
/<tr|<TR/ { print s; s="" }

Ce qui est génial si vous grattez l'écran. En fait, il se peut que j'aime AWK car cela me permet de construire la mauvaise solution aux problèmes si rapidement :) plus d'exemples . Il est également mentionné dans les jolies perles de programmation de Jon Bentley .

Dave
la source
7

J'utilise awk de temps en temps. C'est bon pour un mélange de texte très simple au milieu d'un pipeline; il remplit un créneau très étroit entre ne pas en avoir besoin du tout et avoir besoin de sortir Perl / Python / peu importe.

Je ne vous conseillerais pas de passer beaucoup de temps dessus, mais il pourrait être utile de connaître les bases de la syntaxe - au moins suffisamment pour que vous puissiez consulter le manuel rapidement si vous souhaitez l'utiliser.

Évoli
la source
5

La plupart des doublures awk one peuvent être réalisées avec des doublures Perl one - si vous choisissez d'entrer dans un état d'esprit Perl one liner. Ou, utilisez simplement Perl trois lignes :)

Si vous maintenez des scripts shell écrits par quelqu'un qui aimait awk, alors clairement, vous allez devoir apprendre awk.

Même s'il n'y a pas besoin pratique, si vous connaissez déjà les regex, il ne faudra pas longtemps pour comprendre les bases, et c'est amusant de voir comment les choses ont été conçues à l'époque. C'est plutôt élégant.

svelte
la source
5

6 ans après avoir posé cette question, je peux maintenant répondre avec certitude: non, apprendre awk n'en vaut pas la peine.

Les tâches de base sont manipulées mais les commandes bash de base, ou même les outils GUI facilement. Des tâches plus complexes seront facilement abordées avec des langages dynamiques modernes tels que Python (fav ou mien) ou Ruby.

Vous devriez certainement apprendre un langage dynamique de script moderne car il vous aidera dans de nombreuses tâches (web, administration, analyse de données, automatisation, etc.). Et ce faisant, apprendre un outil comme awk est totalement inutile, cela vous fera gagner au mieux quelques secondes chaque mois.

e-satis
la source
2
Pas forcément vrai. Si vous analysez des fichiers très volumineux, cela pourrait être beaucoup plus rapide que d'autres outils.
user1071847
Intéressant car quelques années plus tard, vous vous posez toujours des questions sur awk. J'étais l'un des premiers intervenants et je l'utilise toujours avec une certaine régularité à ce jour
Dexygen
4

Si vous connaissez et utilisez déjà sed, vous pourriez aussi bien prendre au moins un peu de awk. Ils peuvent être combinés pour des trucs assez puissants. Impressionne toujours le public.

Ami Internet
la source
4

Computerworld a récemment fait une interview avec Alfred V. Aho (l'un des trois créateurs d'AWK) à propos d'AWK. C'est une lecture assez intéressante. Alors peut-être que vous y trouverez des indices, pourquoi c'est une bonne idée d'apprendre AWK.

dlat
la source
Nice, mais ne m'a pas convaincu. AWK est un très bon outil, mais je pense que je n'en aurai jamais assez besoin pour prendre le temps de l'apprendre au lieu de pirater ma solution en sed ou en python.
e-satis le
4

L'apprentissage d'AWK a été inestimable pour moi dans mon dernier contrat de travail sur un système Linux embarqué sur lequel ni Perl ni la plupart des autres langages de script n'étaient installés.

Dexygène
la source
2
9 ans plus tard et j'ai beaucoup utilisé awk aujourd'hui en grepping des journaux git
Dexygen
3

awk a un très bon rapport utilité / difficulté, et "simple awk" fonctionne dans tous les Unix / Linux / MacOS (et il peut être installé dans d'autres systèmes aussi).

Il a été conçu à l'âge d'or quand les gens détestaient taper, donc les scripts peuvent être très, très courts et rapides à écrire. Je vais essayer d'installer mawk, une version rapide, prétendument qu'elle accélère le calcul environ 9 fois, awk / gawk est plutôt lent, donc si vous voulez l'utiliser à la place de R etc., vous voudrez peut-être mawk.

BongBong Chu
la source
2

C'est surtout utile si vous devez occasionnellement analyser des fichiers journaux pour des données ou des sorties de programmes pendant le script shell, car c'est très facile à réaliser dans awk que cela vous prendrait un peu plus de lignes de code en python.

Il a certainement plus de pouvoir que cela, mais cela semble être des tâches pour lesquelles la plupart des gens l'utilisent.

NeuroSys
la source
2

Bien sûr: je travaille dans un environnement où les seuls langages disponibles sont: (un langage shity qui génère COBOL, OMG, OMG), bash (ancienne version), perl (je ne le maîtrise pas encore), sed, awk et quelques autres utilitaires de ligne de commande. Le savoir awkm'a fait gagner plusieurs heures (et avait généré plusieurs tâches de traitement de texte de la part de mes collègues - ils viennent me voir au moins trois fois par jour).

Zsolt Botykai
la source
1

Je dirais que ça n'en vaut probablement plus la peine. Je l'utilise de temps en temps comme un éditeur de flux beaucoup plus polyvalent que sed avec des capacités de recherche incluses, mais si vous maîtrisez python, je ne connais pas une tâche que vous seriez en mesure de terminer beaucoup plus rapidement pour compenser le temps nécessaire pour apprendre awk.

La commande suivante est probablement la seule pour laquelle j'ai utilisé awk au cours des deux dernières années (elle purge les paquets à moitié supprimés de mes systèmes Debian / Ubuntu):

$ dpkg -l|awk '/^rc/ {print $2}'|xargs sudo dpkg -P
Matthias Kestenholz
la source
1

Nan.

Même si cela peut être intéressant, vous pouvez faire tout ce que awk peut faire en utilisant d'autres outils plus puissants tels que Perl.

Passez votre temps à apprendre ces outils plus puissants - et ne prenez que quelques problèmes en cours de route.

Ed Guiness
la source
1

Je dirais que oui. Pour des choses simples, AWK est beaucoup plus facile pour l'administrateur système / développeur inexpérimenté que Python. Vous pouvez apprendre un peu AWK et faire beaucoup de choses, apprendre Python signifie apprendre un tout nouveau langage (oui, je sais qu'AWK est un langage est aussi un sens).

Perl pourrait être capable de faire beaucoup de choses qu'AWK peut faire, mais offert le choix à cette époque, je choisirais Python ici. Alors oui, vous devriez apprendre AWK. mais apprenez aussi Python :-)

wzzrd
la source
1

awkest un langage de powertool, donc vous allez probablement trouver awkutilisé quelque part si vous êtes un professionnel de l'informatique de quelque sorte que ce soit. Si vous pouvez gérer la syntaxe et les expressions régulières de grepet sedalors vous ne devriez pas avoir de problème à le ramasser awket cela en vaut probablement la peine.

Là où j'ai trouvé awkvraiment brillant, c'est dans la simplification des choses comme le traitement des enregistrements multilignes et la manipulation / interpolation de plusieurs fichiers simultanément.


la source
0

Maintenant que PERL est porté sur à peu près toutes les plates-formes importantes, je dirais que cela n'en vaut pas la peine. C'est plus polyvalent que sed et awk ensemble. En ce qui concerne le fractionnement automatique, vous pouvez le faire en perl comme ceci:

perl -F':' -ane 'print $F[3],"\n";' /etc/passwd

EDIT: vous voudrez peut-être encore vous familiariser un peu avec awk, car certains autres outils sont basés sur sa philosophie d'actions basées sur des motifs (par exemple DTrace sur Solaris).

zvrba
la source
0

Je travaille dans la zone où les fichiers sont au format colonne. Donc awk est inestimable pour moi pour REFORMATER le fichier afin que différents logiciels puissent fonctionner ensemble. Pour les professions non informatiques, utiliser awk est suffisant et parfait. Aujourd'hui, la vitesse de l'ordinateur n'est pas un problème, je peux donc combiner awk et unix pour diriger plusieurs commandes 1 liners dans un "script". Avec la recherche Awk par champ et enregistrement, je l'utilise pour vérifier très rapidement les données du fichier, au lieu de "vi" pour ouvrir un fichier. Je dois dire que la capacité awk a particulièrement apporté de la joie à mon travail, je suis capable d'aider mes collègues à régler les choses rapidement en utilisant awk. Code incroyable pour moi.

Hai Truong
la source
0

J'essayais récemment de visualiser des fichiers pcap réseau enregistrant une attaque DOS qui s'élevait à plus de 20Gbs. J'avais besoin de l'horodatage et des adresses IP. Dans mon scénario, AWK one-liner a également fonctionné fabuleusement et assez rapidement. J'ai spécifiquement utilisé AWK pour nettoyer les fichiers extraits, obtenir les adresses IP et le nombre total de paquets à partir de ces adresses IP dans un laps de temps groupé. Je suis totalement d'accord avec ce que d'autres personnes ont écrit ci-dessus. Cela dépend de vos besoins.

Catchem à cendres
la source
0

Une des raisons pour ne PAS apprendre awk est qu'il n'a pas de correspondances non gourmandes dans les expressions régulières.

J'ai un code awk que je dois maintenant réécrire uniquement parce que j'ai soudainement débogué qu'il n'y a pas de correspondance non gourmande dans awk / gawk, donc il ne peut pas exécuter correctement certaines expressions rationnelles.

user619271
la source
0

Cela dépend de vos coéquipiers et de votre leader et de la tâche sur laquelle vous travaillez.

if( team mates and leader ask to write awk ){
  if( you can reject that){
    if( awk code is very small){
      learn little just like learn Regex
    }else{
      use python or even java
    }
  }else{
    do as they ask
  }
}
Kenneth
la source
0

J'ai fait du codage en python pour le moment. Mais je ne le connais toujours pas assez bien pour l'utiliser facilement pour de simples transformations de fichiers uniques.

Avec awk, je peux rapidement développer un morceau de code en une ligne sur la ligne de commande Unix qui effectue des transformations assez rapides. Chaque fois que j'utilise awk, le morceau de code que j'écris sera jetable et ne dépassera pas quelques lignes. Peut-être une instruction "if" et une instruction "printf" ici ou là sur une seule ligne.

Je n'ai jamais écrit un morceau de code de plus de 10 lignes avec awk. J'ai vu de tels scripts il y a des années.

Mais tout ce qui nécessitait de nombreuses lignes de code, je recourrais à python.

J'adore awk. C'est un outil très puissant en combinaison avec sed.

user5901715
la source