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 fitxerFS
variable separadora de camps per llegir text d'entrada amb camps separats per dos punts (:
). - Utilitzar el
OFS
separador de camps de sortida per explicarawk
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.