Cum să utilizați expresiile Awk și obișnuite pentru a filtra textul sau șirul în fișiere


Când rulăm anumite comenzi în Unix/Linux pentru a citi sau edita text dintr-un șir sau fișier, de cele mai multe ori încercăm să filtram rezultatul la o anumită secțiune de interes. Aici este utilă utilizarea expresiilor regulate.

Citiți și: 10 operatori de înlănțuire Linux utili cu exemple practice

Ce sunt expresiile regulate?

O expresie regulată poate fi definită ca șiruri de caractere care reprezintă mai multe secvențe de caractere. Unul dintre cele mai importante lucruri despre expresiile regulate este că vă permit să filtrați rezultatul unei comenzi sau fișiere, să editați o secțiune a unui fișier text sau de configurare și așa mai departe.

Caracteristicile expresiei regulate

Expresiile regulate sunt formate din:

  1. Caractere obișnuite, cum ar fi spațiu, liniuță de subliniere(_), A-Z, a-z, 0-9.
  2. Meta caractere care sunt extinse la personaje obișnuite, acestea includ:

    1. (.) se potrivește cu orice caracter, cu excepția unei linii noi.
    2. (*) se potrivește cu zero sau mai multe existențe ale caracterului imediat care îl precede.
    3. [ caracter(e) ] se potrivește cu oricare dintre caracterele specificate în caracter(e), se poate folosi și o cratimă (-) pentru a însemna o serie de caractere precum ca [a-f], [1-5] și așa mai departe.
    4. ^ se potrivește cu începutul unei linii dintr-un fișier.
    5. $ se potrivește cu sfârșitul rândului dintr-un fișier.
    6. \ este un caracter de escape.

Pentru a filtra textul, trebuie să utilizați un instrument de filtrare a textului, cum ar fi awk. Vă puteți gândi la awk ca la un limbaj de programare propriu. Dar pentru scopul acestui ghid de utilizare a awk, îl vom acoperi ca un simplu instrument de filtrare a liniei de comandă.

Sintaxa generală a awk este:

awk 'script' filename

Unde „script” este un set de comenzi care sunt înțelese de awk și sunt executate pe fișier, nume fișier.

Funcționează citind o anumită linie din fișier, face o copie a liniei și apoi execută scriptul pe linie. Acest lucru se repetă pe toate liniile din fișier.

„scriptul” are forma „/pattern/ action” unde pattern este o expresie regulată, iar acțiunea > este ceea ce va face awk când va găsi modelul dat într-o linie.

Cum să utilizați instrumentul de filtrare Awk în Linux

În următoarele exemple, ne vom concentra pe meta caracterele pe care le-am discutat mai sus sub caracteristicile awk.

Un exemplu simplu de utilizare a awk:

Exemplul de mai jos tipărește toate liniile din fișierul /etc/hosts, deoarece nu este dat niciun model.

awk '//{print}'/etc/hosts

Utilizați Awk cu model:

În exemplul de mai jos, a fost dat un model localhost, așa că awk va potrivi linia care are localhost în fișierul /etc/hosts.

awk '/localhost/{print}' /etc/hosts 

Utilizarea Awk cu (.) wild card într-un Pattern

(.) va potrivi șirurile care conțin loc, localhost, localnet în exemplul de mai jos.

Adică * l some_single_character c *.

awk '/l.c/{print}' /etc/hosts

Utilizarea Awk cu (*) caracter într-un model

Se va potrivi șiruri care conțin localhost, localnet, linii, capable, ca în exemplul de mai jos:

awk '/l*c/{print}' /etc/localhost

De asemenea, veți realiza că (*) încearcă să vă obțină cea mai lungă potrivire posibilă pe care o poate detecta.

Să ne uităm la un caz care demonstrează acest lucru, luăm expresia regulată t*t care înseamnă potriviți șiruri care încep cu litera t și se termină cu t în rândul de mai jos:

this is tecmint, where you get the best good tutorials, how to's, guides, tecmint. 

Veți obține următoarele posibilități atunci când utilizați modelul /t*t/:

this is t
this is tecmint
this is tecmint, where you get t
this is tecmint, where you get the best good t
this is tecmint, where you get the best good tutorials, how t
this is tecmint, where you get the best good tutorials, how tos, guides, t
this is tecmint, where you get the best good tutorials, how tos, guides, tecmint

Și (*) în caracterul wild card /t*t/ îi permite lui awk să aleagă ultima opțiune:

this is tecmint, where you get the best good tutorials, how to's, guides, tecmint

Folosind Awk cu setul [ caracter(e) ]

Luați, de exemplu, setul [al1], aici awk va potrivi toate șirurile care conțin caracterul a sau l sau 1 într-o linie din fișierul /etc/hosts.

awk '/[al1]/{print}' /etc/hosts

Următorul exemplu se potrivește cu șiruri care încep fie cu K, fie cu k urmate de T:

awk '/[Kk]T/{print}' /etc/hosts 

Specificarea caracterelor dintr-un interval

Înțelegeți personajele cu awk:

  1. [0-9] înseamnă un singur număr
  2. [a-z] înseamnă potrivirea unei singure litere mici
  3. [A-Z] înseamnă potrivire cu o singură literă mare
  4. [a-zA-Z] înseamnă potrivire cu o singură literă
  5. [a-zA-Z 0-9] înseamnă potrivire cu o singură literă sau număr

Să ne uităm la un exemplu de mai jos:

awk '/[0-9]/{print}' /etc/hosts 

Toată linia din fișierul /etc/hosts conține cel puțin un singur număr [0-9] în exemplul de mai sus.

Utilizați Awk cu (^) Meta Character

Se potrivește cu toate liniile care încep cu modelul furnizat ca în exemplul de mai jos:

awk '/^fe/{print}' /etc/hosts
awk '/^ff/{print}' /etc/hosts

Utilizați Awk cu ($) Meta Character

Se potrivește cu toate liniile care se termină cu modelul furnizat:

awk '/ab$/{print}' /etc/hosts
awk '/ost$/{print}' /etc/hosts
awk '/rs$/{print}' /etc/hosts

Utilizați Awk cu (\) Escape Character

Vă permite să luați caracterul care îl urmează ca un literal, adică să îl considerați așa cum este.

În exemplul de mai jos, prima comandă tipărește toată linia din fișier, a doua comandă nu tipărește nimic, deoarece vreau să potrivesc o linie care are 25,00 USD, dar nu este folosit niciun caracter de escape.

A treia comandă este corectă, deoarece a fost folosit un caracter de escape pentru a citi $ așa cum este.

awk '//{print}' deals.txt
awk '/$25.00/{print}' deals.txt
awk '/\$25.00/{print}' deals.txt

rezumat

Asta nu este totul cu instrumentul de filtrare în linia de comandă awk, exemplele de mai sus reprezintă operațiunile de bază ale awk. În următoarele părți, vom avansa asupra modului de utilizare a caracteristicilor complexe ale awk. Vă mulțumim pentru citire și pentru orice completări sau clarificări, postați un comentariu în secțiunea de comentarii.