20 exemples awk

20 Awk Examples



Existeixen moltes eines d’utilitat al sistema operatiu Linux per cercar i generar un informe a partir de dades o fitxers de text. L'usuari pot realitzar fàcilment molts tipus de tasques de cerca, substitució i generació d'informes mitjançant ordres awk, grep i sed. awk no és només una ordre. És un llenguatge de seqüència d’ordres que es pot utilitzar tant des del terminal com des del fitxer awk. Admet la variable, sentència condicional, matriu, bucles, etc. com altres llenguatges de seqüència. Pot llegir qualsevol contingut de fitxer línia per línia i separar els camps o les columnes en funció d’un delimitador específic. També admet l'expressió regular per cercar cadenes concretes al contingut o al fitxer de text i realitza accions si es troba alguna coincidència. En aquest tutorial es mostra com podeu utilitzar l'ordre i l'script awk mitjançant 20 exemples útils.

Contingut:

  1. awk amb printf
  2. awk per dividir en l'espai en blanc
  3. awk per canviar el delimitador
  4. awk amb dades delimitades per tabulacions
  5. awk amb dades CSV
  6. awk regex
  7. awk insensible a les regex
  8. awk amb variable nf (nombre de camps)
  9. awk gensub () function
  10. awk amb la funció rand ()
  11. funció awk definida per l'usuari
  12. awk si
  13. variables awk
  14. matrius awk
  15. bucle awk
  16. awk per imprimir la primera columna
  17. awk per imprimir l'última columna
  18. awk amb grep
  19. awk amb el fitxer script bash
  20. awk amb sed

Utilitzant awk amb printf

printf () La funció s'utilitza per formatar qualsevol sortida en la majoria dels llenguatges de programació. Aquesta funció es pot utilitzar amb awk per generar diferents tipus de sortides formatades. Comanda awk que s'utilitza principalment per a qualsevol fitxer de text. Creeu un fitxer de text anomenat empleat.txt amb el contingut que es mostra a continuació, on els camps estan separats per una pestanya (' t').







empleat.txt



1001 John sena 40000
1002 Jafar Iqbal 60000
1003 Meher Nigar 30000
1004 Fetge Jonny 70000

L'ordre awk següent llegirà les dades de empleat.txt fitxer línia per línia i imprimeix el primer fitxer després del format. Aquí, % 10s n significa que la sortida tindrà 10 caràcters. Si el valor de la sortida és inferior a 10 caràcters, els espais s’afegiran a la part frontal del valor.



$ awk'{printf'% 10s n', $ 1}'empleat.txt

Sortida:





Aneu a Contingut



awk per dividir en l'espai en blanc

El separador de paraules o camps predeterminat per dividir qualsevol text és l'espai en blanc. L'ordre awk pot prendre el valor del text com a entrada de diverses maneres. Es passa el text d'entrada des de trobo a l’exemple següent. El text, ' M’agrada programar 'Es dividirà per separador predeterminat, espai , i la tercera paraula s'imprimirà com a sortida.

$trobo 'M'agrada programar' | awk '{print $ 3}'

Sortida:

Aneu a Contingut

awk per canviar el delimitador

L'ordre awk es pot utilitzar per canviar el delimitador de qualsevol contingut de fitxer. Suposem que teniu un fitxer de text anomenat phone.txt amb el contingut següent on s’utilitza ‘:’ com a separador de camps del contingut del fitxer.

phone.txt

+123: 334: 889: 778
+880: 1855: 456: 907
+9: 7777: 38644: 808

Executeu l'ordre awk següent per canviar el delimitador, ':' per '-' al contingut del fitxer, phone.txt .

$ cat phone.txt
$ awk '$ 1 = $ 1' FS = ':' OFS = '-' phone.txt

Sortida:

Aneu a Contingut

awk amb dades delimitades per tabulacions

L'ordre awk té moltes variables incorporades que s'utilitzen per llegir el text de diferents maneres. Dos d’ells ho són FS i OFS . FS és el separador de camps d 'entrada i OFS és la variable separadora de camps de sortida. Els usos d’aquestes variables es mostren en aquesta secció. Crea un fitxa fitxer separat anomenat input.txt amb el contingut següent per provar els usos de FS i OFS variables.

Input.txt

Llenguatge de seqüència d’ordres del client
Llenguatge de seqüència d’ordres del servidor
Servidor de bases de dades
Servidor web

Utilitzant la variable FS amb tabulador

La següent ordre dividirà cada línia de input.txt basat en la pestanya (‘ t’) i imprimiu el primer camp de cada línia.

$awk '{print $ 1}' FS=' t'input.txt

Sortida:

Utilitzant la variable OFS amb tabulador

La següent ordre awk imprimirà el fitxer 9th i 5th camps de ‘ls -l’ sortida de l'ordre amb separador de pestanyes després d'imprimir el títol de la columna Nom i Mida . Aquí, OFS La variable s'utilitza per formatar la sortida mitjançant una pestanya.

$ls -la
$ls -la | awk -v OFS=' t' 'BEGIN {printf'% s t% s n ',' Name ',' Size '} {print $ 9, $ 5}'

Sortida:

Aneu a Contingut

awk amb dades CSV

El contingut de qualsevol fitxer CSV es pot analitzar de diverses maneres mitjançant l'ordre awk. Creeu un fitxer CSV anomenat ' client.csv ’Amb el contingut següent per aplicar l’ordre awk.

client.txt

Identificador, nom, correu electrònic, telèfon
1, Sophia, [correu electrònic protegit], (862) 478-7263
2, Amelia, [correu electrònic protegit], (530) 764-8000
3, Emma, ​​[correu electrònic protegit], (542) 986-2390

S'està llegint un camp únic del fitxer CSV

'-F' L'opció s'utilitza amb l'ordre awk per configurar el delimitador per dividir cada línia del fitxer. La següent ordre awk imprimirà el fitxer nom camp de el client.csv dossier.

$gatclient.csv
$awk -F ',' '{print $ 2}'client.csv

Sortida:

Lectura de diversos camps mitjançant la combinació amb un altre text

L'ordre següent imprimirà tres camps de client.csv combinant el text del títol, Nom, correu electrònic i telèfon . La primera línia del client.csv El fitxer conté el títol de cada camp. NO La variable conté el número de línia del fitxer quan l'ordre awk analitza el fitxer. En aquest exemple, el NR La variable s'utilitza per ometre la primera línia del fitxer. La sortida mostrarà el 2nd, 3rdi 4thcamps de totes les línies excepte la primera línia.

$awk -F ',' 'NR> 1 {print' Nom: '$ 2', correu electrònic: '$ 3', telèfon: '$ 4}'client.csv

Sortida:

Lectura del fitxer CSV mitjançant un script awk

awk script es pot executar executant un fitxer awk. En aquest exemple es mostra com podeu crear un fitxer awk i executar-lo. Creeu un fitxer anomenat awkcsv.awk amb el següent codi. COMENÇA La paraula clau s'utilitza a l'script per informar l'ordre awk per executar l'script del fitxer COMENÇA primer abans d’executar altres tasques. Aquí, separador de camps ( FS ) s’utilitza per definir el delimitador de divisió i 2ndi 1cels camps s’imprimiran segons el format utilitzat a la funció printf ().

awkcsv.awk
COMENÇA{FS= ','} { printf '% 5s (% s) n',$2,$1}

Correr awkcsv.awk fitxer amb el contingut de el client.csv fitxer mitjançant l'ordre següent.

$awk -fawkcsv.awk customer.csv

Sortida:

Aneu a Contingut

awk regex

L’expressió regular és un patró que s’utilitza per cercar qualsevol cadena d’un text. Es poden fer diferents tipus de tasques complicades de cerca i substitució mitjançant l’expressió regular. En aquesta secció es mostren alguns usos senzills de l’expressió regular amb ordre awk.

Caràcter coincidentconjunt

L'ordre següent coincidirà amb la paraula Ximple o ximple o bé Guai amb la cadena d'entrada i imprimeix si la paraula es troba. Aquí, Nina no coincidirà i no s'imprimirà.

$printf 'Ximple nGuai nNina nbool ' | awk '/ [FbC] ool /'

Sortida:

Cerca de cadenes al començament de la línia

'^' El símbol s'utilitza a l'expressió regular per cercar qualsevol patró a l'inici de la línia. ' Linux ” es cercarà una paraula a l'inici de cada línia del text a l'exemple següent. Aquí, dues línies comencen amb el text, ‘Linux ’I aquestes dues línies es mostraran a la sortida.

$trobo -I 'Linux és d'ús gratuït nÉs un programari de codi obert nLinuxHint és
un lloc popular de blocs '
| awk '/ ^ Linux /'

Sortida:

Cerca de cadenes al final de la línia

'$' El símbol s'utilitza a l'expressió regular per buscar qualsevol patró al final de cada línia del text. ' Guió ’Es cerca la paraula a l’exemple següent. Aquí, dues línies contenen la paraula, Guió al final de la línia.

$trobo -I 'Script PHP nJavaScript nProgramació visual ' | awk '/ Script $ /'

Sortida:

Cerqueu ometent un conjunt de caràcters concret

'^' El símbol indica l'inici del text quan s'utilitza davant d'un patró de cadena ( '/ ^ ... /') o abans de qualsevol joc de caràcters declarat per ^ [...] . Si el fitxer '^' El símbol s'utilitza dins del tercer claudàtor, [^ ...] llavors el conjunt de caràcters definit dins del claudàtor s'ometrà en el moment de la cerca. L'ordre següent cercarà qualsevol paraula que no comenci per 'F' però acabant amb ' ool '. Guai i bool s’imprimirà d’acord amb el patró i les dades de text.

$ printf 'Ximple nGuai nNina nbool ' |awk'/ [^ F] ool /'

Sortida:

Aneu a Contingut

awk insensible a les regex

Per defecte, l'expressió regular fa una cerca sensible a majúscules i minúscules quan es busca qualsevol patró de la cadena. La cerca que no distingeix entre majúscules i minúscules es pot fer mitjançant l’ordre awk amb l’expressió regular. A l'exemple següent, abaixar() La funció s'utilitza per fer cerques sense distinció entre majúscules i minúscules. Aquí, la primera paraula de cada línia del text d'entrada es convertirà en minúscula mitjançant abaixar() funcionen i coincideixen amb el patró d’expressió regular. toupper () La funció també es pot utilitzar per a aquest propòsit; en aquest cas, el patró ha de ser definit per majúscules. El text definit a l'exemple següent conté la paraula de cerca, 'web ’En dues línies que s’imprimiran com a sortida.

$trobo -I 'Web Design ndesenvolupament web nMarc ' | awk 'tolower ($ 0) ~ / ^ web /;'

Sortida:

Aneu a Contingut

awk amb variable NF (nombre de camps)

NF és una variable incorporada de l'ordre awk que s'utilitza per comptar el nombre total de camps de cada línia del text d'entrada. Creeu qualsevol fitxer de text amb diverses línies i diverses paraules. l’entrada.txt aquí s’utilitza el fitxer que es crea a l’exemple anterior.

Utilitzant NF des de la línia d’ordres

Aquí, la primera ordre s'utilitza per mostrar el contingut de input.txt file i la segona ordre s'utilitzen per mostrar el nombre total de camps de cada línia del fitxer que utilitza NF variable.

$ cat input.txt
$ awk '{print NF}' input.txt

Sortida:

Utilitzant NF al fitxer awk

Creeu un fitxer awk anomenat count.awk amb el guió que es mostra a continuació. Quan aquest script s’executarà amb qualsevol dada de text, s’imprimirà cada sortida de contingut de línia amb camps totals.

count.awk

{imprimeix $0}
{imprimir'[Camps totals:'NF']'}

Executeu l'script mitjançant l'ordre següent.

$awk -fcount.awk input.txt

Sortida:

Aneu a Contingut

awk gensub () function

getsub () és una funció de substitució que s'utilitza per cercar cadenes basades en un delimitador particular o un patró d'expressió regular. Aquesta funció es defineix a 'Desconcert' paquet que no està instal·lat per defecte. A continuació es mostra la sintaxi d'aquesta funció. El primer paràmetre conté el patró d’expressió regular o el delimitador de cerca, el segon paràmetre conté el text de substitució, el tercer paràmetre indica com es farà la cerca i l’últim paràmetre conté el text en què s’aplicarà aquesta funció.

Sintaxi:

gensub(regexp, substitució, com[, objectiu])

Executeu l'ordre següent per instal·lar-la desconcert paquet per utilitzar getsub () funció amb l'ordre awk.

$ sudo apt-get install gawk

Creeu un fitxer de text anomenat ' salesinfo.txt ’Amb el contingut següent per practicar aquest exemple. Aquí, els camps estan separats per una pestanya.

salesinfo.txt

El meu 700000
El vostre 800000
Dm 750000
Recolliu 200000
Div. 430000
Ds 820000

Executeu l'ordre següent per llegir els camps numèrics del fitxer salesinfo.txt arxivar i imprimir el total de l'import de les vendes. Aquí, el tercer paràmetre, 'G', indica la cerca global. Això significa que es buscarà el patró al contingut complet del fitxer.

$awk '{x = gensub (' t ',' ',' G ', $ 2); printf x '+'} END {print 0} 'salesinfo.txt| bc -la

Sortida:

Aneu a Contingut

awk amb la funció rand ()

fila () La funció s'utilitza per generar qualsevol nombre aleatori superior a 0 i inferior a 1. Per tant, sempre generarà un nombre fraccionari inferior a 1. L'ordre següent generarà un nombre aleatori fraccionat i multiplicarà el valor per 10 per obtenir un nombre superior a 1. S'imprimirà un número fraccionari amb dos dígits després del punt decimal per aplicar la funció printf (). Si executeu l'ordre següent diverses vegades, obtindreu una sortida diferent cada vegada.

$awk 'BEGIN {printf' El número és =%. 2f n ', rand () * 10}'

Sortida:

Aneu a Contingut

funció awk definida per l'usuari

Totes les funcions que s’utilitzen en els exemples anteriors són funcions integrades. Però podeu declarar una funció definida per l'usuari al vostre script awk per fer qualsevol tasca en particular. Suposem que voleu crear una funció personalitzada per calcular l'àrea d'un rectangle. Per fer aquesta tasca, creeu un fitxer anomenat ' area.awk ’Amb el següent guió. En aquest exemple, es denomina una funció definida per l'usuari area () es declara a l'script que calcula l'àrea en funció dels paràmetres d'entrada i retorna el valor de l'àrea. getline aquí s’utilitza la comanda per obtenir l’entrada de l’usuari.

area.awk

# Calcula l'àrea
funcióàrea(alçada,amplada){
tornaralçada*amplada
}

# Inicia l'execució
COMENÇA{
imprimir'Introduïu el valor de l'alçada:'
getline h< '-'
imprimir'Introduïu el valor de l'amplada:'
getline w< '-'
imprimir'Àrea ='àrea(h,dins)
}

Executeu l'script.

$awk -farea.awk

Sortida:

Aneu a Contingut

awk if exemple

awk admet sentències condicionals com altres llenguatges de programació estàndard. En aquesta secció es mostren tres tipus d’instruccions if mitjançant tres exemples. Creeu un fitxer de text anomenat articles.txt amb el contingut següent.

articles.txt

Disc dur Samsung 100 $
Ratolí A4Tech
Impressora HP 200 $

Exemple senzill :

El següent comandament llegirà el contingut del fitxer articles.txt arxiu i comproveu el fitxer 3rd valor del camp a cada línia. Si el valor està buit, s'imprimirà un missatge d'error amb el número de línia.

$awk '{if ($ 3 ==' ') print' Falta el camp Preu a la línia 'NR}'articles.txt

Sortida:

exemple if-else:

L'ordre següent imprimirà el preu de l'article si el 3rdexisteix a la línia, en cas contrari, s'imprimirà un missatge d'error.

$ awk'{if ($ 3 ==' ') imprimeix' Falta el camp Preu '
en cas contrari, imprimeix 'el preu de l'article és' $ 3} '
articles.txt

Sortida:

exemple if-else-if:

Quan s'executarà la següent ordre des del terminal, prendrà l'entrada de l'usuari. El valor d'entrada es compararà amb cada condició if fins que la condició sigui certa. Si alguna condició es compleix, s'imprimirà la qualificació corresponent. Si el valor d'entrada no coincideix amb cap condició, la impressió fallarà.

$awk 'BEGIN {print' Introduïu la marca: '
marca getline<'-'
si (marca> = 90) imprimeix 'A +'
en cas contrari, si (marca> = 80) imprimiu 'A'
en cas contrari, si (marca> = 70) imprimiu 'B +'
en cas contrari, imprimeix 'Falla'}

Sortida:

Aneu a Contingut

variables awk

La declaració de la variable awk és similar a la declaració de la variable de l'intèrpret d'ordres. Hi ha una diferència en la lectura del valor de la variable. El símbol '$' s'utilitza amb el nom de la variable de la variable de l'intèrpret d'ordres per llegir el valor. Però no cal que utilitzeu '$' amb la variable awk per llegir el valor.

Utilitzant una variable simple:

L'ordre següent declararà una variable anomenada 'Lloc' i s'assigna un valor de cadena a aquesta variable. El valor de la variable s’imprimeix a la sentència següent.

$awk 'BEGIN {site =' LinuxHint.com '; lloc d'impressió} '

Sortida:

Utilització d’una variable per recuperar dades d’un fitxer

L'ordre següent cercarà la paraula 'Impressora' al fitxer articles.txt . Si comença qualsevol línia del fitxer ‘Impressora ’Llavors emmagatzemarà el valor de 1c , 2nd i 3rd camps en tres variables. nom i preu s'imprimiran les variables.

$ awk'/ Impressora / {name = $ 1; marca = $ 2; preu = $ 3; print' item name = 'nom;
print 'item price =' price} '
articles.txt

Sortida:

Aneu a Contingut

matrius awk

Tant les matrius numèriques com les associades es poden utilitzar a awk. La declaració de variables de matriu a awk és la mateixa que la resta de llenguatges de programació. En aquesta secció es mostren alguns usos de les matrius.

Matriu associativa:

L'índex de la matriu serà qualsevol cadena per a la matriu associativa. En aquest exemple, es declara i s'imprimeix una matriu associativa de tres elements.

$awk 'COMENÇA {
books ['Web Design'] = 'Aprendre HTML 5';
books ['Web Programming'] = 'PHP i MySQL'
books ['PHP Framework'] = 'Aprenentatge de Laravel 5'
printf '% s n% s n% s n', llibres ['Disseny web'], llibres ['Programació web'],
llibres ['PHP Framework']} '

Sortida:

Matriu numèrica:

Es declara i s'imprimeix una matriu numèrica de tres elements separant la pestanya.

$ awk'COMENÇA {
número [0] = 80;
número [1] = 55;
número [2] = 76;

# imprimir elements de matriu
printf 'Valors de matriu:% d t% d t% d n', número [0], número [1], número [2]; } '

Sortida:

Aneu a Contingut

bucle awk

Awk admet tres tipus de bucles. Els usos d’aquests bucles es mostren aquí mitjançant l’ús de tres exemples.

Loop mentre:

El bucle while que s'utilitza a l'ordre següent iterarà 5 vegades i sortirà del bucle per a la sentència break.

$ awk 'COMENÇA {n = 1; mentre (n 5) trenca; imprimir n; n ++}} '

Sortida:

Per a bucle:

Per al bucle que s'utilitza a l'ordre awk següent es calcularà la suma d'1 a 10 i s'imprimirà el valor.

$awk 'BEGIN {suma = 0; per a (n = 1; n<= 10; n++) sum=sum+n; print sum }'

Sortida:

Bucle de durada:

un bucle do-while de l'ordre següent imprimirà tots els números parells del 10 al 5.

$awk 'BEGIN {comptador = 10; fer {if (comptador% 2 == 0) imprimir comptador; comptador-- }
mentre que (comptador> 5)} '

Sortida:

Aneu a Contingut

awk per imprimir la primera columna

La primera columna de qualsevol fitxer es pot imprimir mitjançant la variable $ 1 a awk. Però si el valor de la primera columna conté diverses paraules, només s’imprimeix la primera paraula de la primera columna. Mitjançant un delimitador específic, la primera columna es pot imprimir correctament. Creeu un fitxer de text anomenat alumnes.txt amb el contingut següent. Aquí, la primera columna conté el text de dues paraules.

Estudiants.txt

Kaniz Fatema 30thlot
Abir Hossain 35thlot
John Abraham 40thlot

Executeu l'ordre awk sense cap delimitador. S'imprimirà la primera part de la primera columna.

$awk '{print $ 1}'alumnes.txt

Executeu l'ordre awk amb el següent delimitador. S'imprimirà la part completa de la primera columna.

$awk -F '\ s \ s' '{print $ 1}'alumnes.txt

Sortida:

Aneu a Contingut

awk per imprimir l'última columna

$ (NF) La variable es pot utilitzar per imprimir l'última columna de qualsevol fitxer. Les següents ordres awk imprimiran la darrera part i la part completa de la darrera columna de els estudiants.txt dossier.

$awk '{print $ (NF)}'alumnes.txt
$awk -F '\ s \ s' '{print $ (NF)}'alumnes.txt

Sortida:

Aneu a Contingut

awk amb grep

grep és un altre comandament útil de Linux per cercar contingut en un fitxer basat en qualsevol expressió regular. A l'exemple següent es mostra com es poden utilitzar les ordres awk i grep juntes. adherència s’utilitza per cercar informació de l’identificador d’empleat, ‘ 1002 ’De l’empleat.txt dossier. La sortida de l'ordre grep s'enviarà a awk com a dades d'entrada. Es comptarà i s’imprimirà una bonificació del 5% en funció del salari de l’identificador de l’empleat, ‘ 1002 ' per ordre awk.

$gatempleat.txt
$adherència '1002'empleat.txt| awk -F ' t' '{print $ 2' obtindrà $ '($ 3 * 5) / 100' bonus '}'

Sortida:

Aneu a Contingut

awk amb fitxer BASH

Igual que altres ordres de Linux, les ordres awk també es poden utilitzar en un script BASH. Creeu un fitxer de text anomenat clients.txt amb el contingut següent. Cada línia d'aquest fitxer conté informació sobre quatre camps. Es tracta de l’identificació, el nom, l’adreça i el número de mòbil del client separats per '/ '.

clients.txt

AL4934 / Charles M Brunner / 4838 Beeghley Street, Huntsville, Alabama / 256-671-7942
CA5455 / Virginia S Mota / 930 Bassel Street, VALLECITO, Califòrnia / 415-679-5908
IL4855 / Ann A Neale / 1932 Patterson Fork Road, Chicago, Illinois / 773-550-5107

Creeu un fitxer bash anomenat item_search.bash amb el següent guió. Segons aquest script, el valor de l'estat es prendrà de l'usuari i es cercarà els clients.txt arxiu per adherència i es passa a l'ordre awk com a entrada. Es llegirà l'ordre Awk 2nd i 4th camps de cada línia. Si el valor d'entrada coincideix amb qualsevol valor d'estat de clients.txt després s’imprimirà la del client nom i número de mòbil , en cas contrari, imprimirà el missatge No s'ha trobat cap client .

item_search.bash

#! / bin / bash
trobo 'Introduïu el nom de l'estat:'
llegirestat
clients=`adherència '$ estat'clients.txt| awk -F '/' Nom del client '{print': '$ 2',
No de mòbil: '$ 4}'
`
si [ '$ clients' !='' ];llavors
trobo $ clients
en cas contrari
trobo 'No s'ha trobat cap client'
ser

Executeu les ordres següents per mostrar les sortides.

$gatclients.txt
$bashitem_search.bash

Sortida:

Aneu a Contingut

awk amb sed

Una altra eina útil de cerca de Linux és sed . Aquesta ordre es pot utilitzar tant per cercar com per substituir text de qualsevol fitxer. L'exemple següent mostra l'ús de l'ordre awk amb sed comandament. Aquí, l'ordre sed buscarà tots els noms dels empleats comença per ' J ’I passa a l’ordre awk com a entrada. awk imprimirà empleat nom i Identificació després del format.

$gatempleat.txt
$sed -n '/ J / p'empleat.txt| awk -F ' t' '{printf'% s (% s) n ', $ 2, $ 1}'

Sortida:

Aneu a Contingut

Conclusió:

Podeu utilitzar l'ordre awk per crear diferents tipus d'informes basats en qualsevol dada tabular o delimitada després de filtrar-les correctament. Esperem que pugueu aprendre com funciona l'ordre awk després de practicar els exemples mostrats en aquest tutorial.