Com s'utilitza l'ordre awk a Linux

A Linux,awk és una dinamo de manipulació de text en línia d'ordres, així com un llenguatge de seqüència de comandaments potent. Aquí teniu una introducció a algunes de les seves funcions més interessants.

Què awk va tenir el seu nom

Elawk El comandament es va anomenar utilitzant les inicials de les tres persones que van escriure la versió original el 1977: Alfred Aho, Peter Weinberger i Brian Kernighan. Aquests tres homes eren del mític panteó AT&T Bell Laboratories Unix. Amb les aportacions de molts altres des de llavors, awk ha continuat evolucionant.

És un llenguatge de seqüències d’ordres complet, així com un conjunt d’eines de manipulació de text complet per a la línia d’ordres. Si aquest article us genera gana, podeu consultar tots els detallsawk i la seva funcionalitat.

Regles, patrons i accions

awk treballa en programes que contenen regles compostes de patrons i accions. L'acció s'executa al text que coincideix amb el patró. Els patrons estan tancats entre claus ({}). Junts, un patró i una acció formen una regla. La totalitat awk el programa s’inclou entre cometes simples (').

Vegem el tipus més senzill awk programa. No té cap patró, de manera que coincideix amb totes les línies de text que s’hi introdueixen. Això significa que l'acció s'executa a cada línia. L’utilitzarem a la sortida del OMS comandament.

Aquí teniu el resultat estàndard de OMS:

OMS

Potser no necessitem tota aquesta informació, sinó que només volem veure els noms dels comptes. Podem canalitzar la sortida des de OMS dins awk, i després explica awk per imprimir només el primer camp.

Per defecte, awk considera que un camp és una cadena de caràcters envoltats d'espai en blanc, l'inici d'una línia o el final d'una línia. Els camps s’identifiquen mitjançant un signe de dòlar ($) i un número. Tan,$1 representa el primer camp, que utilitzarem amb imprimir acció per imprimir el primer camp.

Escrivim el següent:

qui | awk '{print $ 1}'

awk imprimeix el primer camp i descarta la resta de la línia.

Podem imprimir tants camps com vulguem. Si afegim una coma com a separador,awk imprimeix un espai entre cada camp.

Escrivim el següent per imprimir també l’hora en què la persona ha iniciat la sessió (camp quatre):

qui | awk '{print $ 1, $ 4}'

Hi ha un parell d'identificadors de camp especials. Aquests representen tota la línia de text i l'últim camp de la línia de text:

  • $0: Representa tota la línia de text.
  • $1: Representa el primer camp.
  • $2: Representa el segon camp.
  • $7: Representa el setè camp.
  • $45: Representa el camp número 45.
  • $ NF: Significa "nombre de camps" i representa l'últim camp.

Escrivirem el següent per mostrar un petit fitxer de text que contingui una cita curta atribuïda a Dennis Ritchie:

cat dennis_ritchie.txt

Volemawk per imprimir el primer, segon i últim camp de la cita. Tingueu en compte que, tot i que s’enrotlla a la finestra del terminal, només és una sola línia de text.

Escrivim l'ordre següent:

awk '{print $ 1, $ 2, $ NF}' dennis_ritchie.txt

No coneixem aquesta "simplicitat". és el 18è camp de la línia de text i no ens importa. El que sí sabem és que és l’últim camp i que podem utilitzar $ NF per obtenir el seu valor. El període només es considera un personatge més del cos del camp.

Addició de separadors de camps de sortida

També ho pots saber awk per imprimir un caràcter concret entre camps en lloc del caràcter d'espai per defecte. La sortida per defecte del fitxerdata l'ordre és lleugerament peculiar perquè l'hora es desploma al centre. No obstant això, podem escriure el següent i utilitzar-lo awk per extreure els camps que volem:

data
data | awk "{print $ 2, $ 3, $ 6}"

Farem servir el OFS Variable (separador de camps de sortida) per situar un separador entre el mes, el dia i l'any. Tingueu en compte que a continuació adjuntem l’ordre entre cometes simples ('), no claus ({}):

data | awk 'OFS = "/" {print $ 2, $ 3, $ 6}'
data | awk 'OFS = "-" {print $ 2, $ 3, $ 6}'

Les regles BEGIN i END

A COMENÇA La regla s'executa una vegada abans que comenci el processament de text. De fet, s’ha executat abans awk fins i tot llegeix qualsevol text. An FINAL la regla s'executa un cop finalitzat tot el processament. Podeu tenir-ne diversos COMENÇA iFINAL i s’executaran en ordre.

Per al nostre exemple de COMENÇA per regla general, imprimirem la cita sencera des de dennis_ritchie.txt fitxer que hem utilitzat anteriorment amb un títol a sobre.

Per fer-ho, escrivim aquesta ordre:

awk 'BEGIN {print "Dennis Ritchie"} {print $ 0}' dennis_ritchie.txt

Tingueu en compte el fitxer COMENÇA la regla té el seu propi conjunt d'accions incloses dins del seu propi conjunt de claus ({}).

Podem utilitzar aquesta mateixa tècnica amb l’ordre que hem utilitzat anteriorment per a la sortida de canonades OMS dins awk. Per fer-ho, escrivim el següent:

qui | awk 'BEGIN {print "Active Sessions"} {print $ 1, $ 4}'

Separadors de camps d’entrada

Si vols awk per treballar amb text que no utilitzi espais en blanc per separar camps, heu de dir-li quin caràcter utilitza el text com a separador de camps. Per exemple, el fitxer / etc / passwd el fitxer utilitza dos punts (:) per separar camps.

Utilitzarem aquest fitxer i el fitxer -F (cadena separadora) opció per explicar awk utilitzar els dos punts (:) com a separador. Escrivim el següent per dir-ho awk per imprimir el nom del compte d'usuari i la carpeta d'inici:

awk -F: '{print $ 1, $ 6}' / etc / passwd

La sortida conté el nom del compte d'usuari (o l'aplicació o el nom del dimoni) i la carpeta d'inici (o la ubicació de l'aplicació).

Addició de patrons

Si l’interès que ens interessa són comptes d’usuari habituals, podem incloure un patró amb la nostra acció d’impressió per filtrar totes les altres entrades. Com que els números d’identificació d’usuari són iguals o superiors a 1.000, podem basar el filtre en aquesta informació.

Escrivim el següent per executar la nostra acció d'impressió només quan el tercer camp ($3) conté un valor de 1.000 o superior:

awk -F: '$ 3> = 1000 {print $ 1, $ 6}' / etc / passwd

El patró ha de precedir immediatament l’acció amb què s’associa.

Podem utilitzar el COMENÇA regla per proporcionar un títol al nostre petit informe. Escrivim el següent, utilitzant el (\ n) notació per inserir un caràcter de nova línia a la cadena de títol:

awk -F: 'BEGIN {print "Comptes d'usuari \ n -------------"} $ 3> = 1000 {print $ 1, $ 6}' / etc / passwd

Els patrons són expressions regulars de ple dret i són una de les glòries de awk.

Diguem que volem veure els identificadors (UUID) universals únics dels sistemes de fitxers muntats. Si busquem a través de / etc / fstab fitxer per a les ocurrències de la cadena "UUID", hauria de retornar-nos aquesta informació.

Utilitzem el patró de cerca "/ UUID /" al nostre comandament:

awk '/ UUID / {print $ 0}' / etc / fstab

Cerca totes les ocurrències de "UUID" i imprimeix aquestes línies. De fet, hauríem obtingut el mateix resultat sense el imprimir acció perquè l'acció predeterminada imprimeix tota la línia de text. Per claredat, però, sovint és útil ser explícit. Quan mireu un script o un fitxer d’història, us alegrarà que us deixeu pistes.

La primera línia que es va trobar va ser una línia de comentaris i, tot i que la cadena "UUID" es troba al centre, awk encara ho he trobat. Podem modificar l’expressió regular i dir-ho awk per processar només les línies que comencen per "UUID". Per fer-ho, escrivim el següent que inclou l’inici del testimoni de línia (^):

awk '/ ^ UUID / {print $ 0}' / etc / fstab

Això està millor! Ara només veiem instruccions de muntatge genuïnes. Per refinar encara més la sortida, escrivim el següent i restringim la visualització al primer camp:

awk '/ ^ UUID / {print $ 1}' / etc / fstab

Si tinguéssim muntats diversos sistemes de fitxers en aquesta màquina, obtindríem una taula ordenada dels seus UUID.

Funcions incorporades

awk té moltes funcions que podeu trucar i utilitzar en els vostres propis programes, tant des de la línia d’ordres com en scripts. Si feu algunes excavacions, el trobareu molt fructífer.

Per demostrar la tècnica general per anomenar una funció, veurem algunes de numèriques. Per exemple, el següent imprimeix l'arrel quadrada de 625:

awk 'BEGIN {print sqrt (625)}'

Aquesta ordre imprimeix l’arcangent de 0 (zero) i -1 (que passa a ser la constant matemàtica, pi):

awk 'BEGIN {print atan2 (0, -1)}'

A l'ordre següent, modificem el resultat del fitxer atan2 () funció abans d'imprimir-lo:

awk 'BEGIN {print atan2 (0, -1) * 100}'

Les funcions poden acceptar expressions com a paràmetres. Per exemple, aquí hi ha una manera enrevessada de sol·licitar l’arrel quadrada de 25:

awk 'BEGIN {print sqrt ((2 + 3) * 5)}'

awk Scripts

Si la vostra línia d’ordres es complica o desenvolupeu una rutina que sabeu que voldreu tornar a utilitzar, podeu transferir-la awk ordre en un script.

Al nostre script d’exemple, farem tot el següent:

  • Digueu a l'intèrpret d'ordres quin executable s'ha d'utilitzar per executar l'script.
  • Prepara’t awk utilitzar el fitxer FS variable separadora de camps per llegir text d'entrada amb camps separats per dos punts (:).
  • Utilitzar el OFS separador de camps de sortida per explicar awk utilitzar dos punts (:) per separar els camps de la sortida.
  • Estableix un comptador a 0 (zero).
  • Establiu el segon camp de cada línia de text en un valor en blanc (sempre és una "x", de manera que no cal que el vegem).
  • Imprimiu la línia amb el segon camp modificat.
  • Incrementeu el taulell.
  • Imprimiu el valor del comptador.

El nostre guió es mostra a continuació.

El COMENÇA la norma realitza els passos preparatoris, mentre que laFINAL La regla mostra el valor del comptador. La regla central (que no té nom ni patró perquè coincideixi amb totes les línies) modifica el segon camp, imprimeix la línia i augmenta el comptador.

La primera línia de l'script indica a l'intèrpret d'ordres quin executable s'ha d'utilitzar (awk, al nostre exemple) per executar l'script. També passa el -f (nom del fitxer) a awk, que l’informa que el text que processarà provindrà d’un fitxer. Passarem el nom del fitxer a l’escriptura quan l’executem.

Hem inclòs l'script següent com a text perquè pugueu retallar i enganxar:

#! / usr / bin / awk -f BEGIN {# set the input and output field separators FS = ":" OFS = ":" # zero the accounts counter accounts = 0} {# set field 2 to nothing $ 2 = "" # imprimeix la línia sencera imprimeix $ 0 # compta un altre compte de compte ++} FINAL {# imprimeix els resultats "imprimeix els comptes. \ n"}

Deseu-lo en un fitxer anomenat omet.awk. Per fer executable l'script, escrivim el següent mitjançant chmod:

chmod + x omit.awk

Ara, l’executarem i passarem el / etc / passwd fitxer al script. Aquest és el fitxerawk processarà per a nosaltres, utilitzant les regles del script:

./omit.awk / etc / passwd

El fitxer es processa i es mostra cada línia, com es mostra a continuació.

Les entrades "x" del segon camp s'han eliminat, però tingueu en compte que els separadors de camps continuen presents. Les línies es compten i el total es dóna a la part inferior de la sortida.

awk no significa incòmode

awk no significa incòmode; significa elegància. S'ha descrit com un filtre de processament i un redactor d'informes. Més exactament, són les dues coses o, millor dit, una eina que podeu utilitzar per a aquestes dues tasques. En poques línies,awk aconsegueix allò que requereix una extensa codificació en un idioma tradicional.

Aquest poder s’aprofita pel simple concepte de regles que contenen patrons, que seleccionen el text a processar i accions que defineixen el processament.


$config[zx-auto] not found$config[zx-overlay] not found