Utilizarea corectă a comenzilor Find și Grep în Linux

Majoritatea utilizatorilor începători ai sistemelor Unix, în special Linux, nu sunt familiarizați cu operatorii liniei de comandă de bază utilizați în acest sistem de operare. Să aruncăm o privire mai atentă asupra funcțiilor și utilizării operatorilor de căutare și grep.

Utilizarea comenzilor Find și Grep în Linux.

FIND

Comanda Linux find este un utilitar pentru linia de comandă pentru traversarea ierarhiei fișierelor. Acesta poate fi folosit pentru a căuta fișiere și directoare și pentru a efectua operații ulterioare cu ele. Acesta acceptă căutarea după fișier, dosar, nume, data creării, data schimbării, proprietar și permisiuni. Folosind -exec, alte comenzi UNIX pot fi executate pentru fișierele sau folderele găsite. sintaxa:

$ find [unde să înceapă căutarea] [expresia determină ce să găsești] [-opțiuni] [ce să găsești]

opțiuni:

  • -exec - fișierul care îndeplinește criteriile de mai sus și returnează 0 ca stare de ieșire pentru executarea cu succes a comenzii;
  • -ok - funcționează la fel ca -exec, cu excepția faptului că utilizatorul este solicitat mai întâi;
  • -inum N - căutați cu numărul "N";
  • - legături N - căutare cu linkuri "N";
  • -name demo - căutarea fișierelor specificate în "demo";
  • -newer file - căutarea fișierelor care au fost modificate / create după "fișier";
  • -perm octal - căutați dacă rezoluția este octală;
  • -print - arată calea către documentele găsite utilizând celelalte criterii;
  • -empty - căutarea documentelor și a directoarelor goale;
  • -size + N / -N - blocuri de căutare "N"; "N" și "c" pot fi utilizate pentru măsurarea mărimii în caractere; "+ N" înseamnă o dimensiune mai mare a blocurilor "N", iar "-N" înseamnă o dimensiune mai mică a blocurilor "N";
  • - nume utilizator - căutarea documentelor care aparțin numelui de utilizator sau identificatorului "nume";
  • \ (expr \) - Adevărat dacă "expr" este adevărat; Folosit pentru a grupa criteriile împreună cu OR sau AND.

grep

Comanda grep este utilizată pentru a căuta fișiere. Funcția este reprezentată de "imprimarea globală a expresiilor regulate" și este una dintre cele mai puternice și mai utilizate comenzi din Linux. Comanda caută unul sau mai multe fișiere de intrare care se potrivesc cu modelul specificat și scrie fiecare linie corespunzătoare la ieșirea standard. Dacă nu sunt specificate fișiere, comanda citește din intrarea standard, care este de obicei rezultatul unei alte comenzi. În acest articol, vă vom arăta cum să introduceți o comandă, cu exemple practice și explicații detaliate despre cele mai comune opțiuni GNU grep.

Comanda sintaxă

Înainte de a începe să folosim comanda, să începem prin revizuirea sintaxei de bază. Expresiile de utilitate au următoarea formă:

[OPȚIUNI] PATTERN [FILE ...]

Elementele din paranteze pătrate sunt opționale.

  • OPȚIUNI - opțiuni zero sau mai multe. Echipa oferă o serie de opțiuni care îi controlează comportamentul.
  • PATTERN - Model de căutare.
  • FILE - nume zero sau mai multe fișiere de intrare.

Cum se introduce o comandă pentru a căuta fișiere

Scopul principal al comenzii este de a căuta text în fișier. De exemplu, pentru a afișa din fișierul / etc / passwd care conține linia bash, puteți folosi următoarea comandă:

$ grep bash / etc / passwd

Rezultatul ar trebui să arate astfel:

root 0: 0: rădăcină: / root: / bin / bash

domeniu1000: 1000: domeniu: / home / domain: / bin / bash

Dacă șirul conține spații, trebuie să îl includeți în citate simple sau duble:

$ "Manager de afișare Gnome" / etc / passwd

Invert Match (ex)

Pentru a afișa linii care nu se potrivesc cu modelul, introduceți parametrul -v (sau -inversare-potrivire). De exemplu, pentru a afișa un fișier care nu conține nologin din fișierul / etc / passwd, puteți introduce următoarea comandă:

$ -v nologin / etc / passwd

ieşire:

root 0: 0: rădăcină: / root: / bin / bash

colorectură 124: 124 :: / var / lib / colord: / bin / false

git 994: 994: utilizator daemon git: /: / usr / bin / git-shell

linuxize 1000: 1000: linuxize: / home / linuxize: / bin / bash

Cum se utilizează comanda pentru a căuta ieșirea

În schimb, dacă specificați fișiere de intrare, puteți redirecționa ieșirea unei alte comenzi și apoi afișați numai liniile care se potrivesc cu modelul specificat. De exemplu, pentru a afla care procese rulează pe sistemul dvs. ca utilizator de date www, puteți utiliza următoarea comandă:

$ ps -ef | www-date

ieşire:

www-date 18247 12675 4 16:00? 00:00:00 php-fpm: piscină www

rădăcină 18272 17714 0 16:00 pts / 0 00:00:00 -color = auto - exclude-dir = .bzr -exclude-dir = CVS -exclude-dir = .git -exclude-dir = .hg -exclude-dir = .svn www-date

www-date 31147 12770 0 Oct 22? Nginx: proces de lucru

www-date 31148 12770 0 Oct 22? 00:00:00 nginx: procesul managerului de cache

De asemenea, puteți combina mai multe canale într-o echipă. După cum puteți vedea în rezultatul de mai sus, există și o linie care conține procesul. Dacă nu doriți ca această linie să fie afișată, trimiteți ieșirea către o altă instanță, după cum se arată mai jos.

$ ps -ef | www-date | grep -v grep

ieşire:

www-date 18247 12675 4 16:00? 00:00:00 php-fpm: piscină www

rădăcină 18272 17714 0 16:00 pts / 0 00:00:00 -color = auto - exclude-dir = .bzr -exclude-dir = CVS -exclude-dir = .git -exclude-dir = .hg -exclude-dir = .svn www-date

www-date 31147 12770 0 Oct 22? Nginx: proces de lucru

www-date 31148 12770 0 Oct 22? 00:00:00 nginx: procesul managerului de cache

Căutarea recursivă

Pentru a căuta recursiv un model, introduceți opțiunea -r (sau -recursivă). Acest lucru vă va permite să căutați prin toate fișierele din directorul specificat, sărind legăturile simbolice care apar recursiv. Pentru a trece prin toate legăturile simbolice, utilizați opțiunea -r (sau -deferință-recursivă). În următorul exemplu, căutăm domain.com în toate fișierele din directorul / etc:

$ -r domain.com / etc

Comanda va imprima câmpurile corespunzătoare cu prefixul căii complete de fișiere.

/etc/hosts:127.0.0.1 node2.domain.com /etc/nginx/sites-available/domain.com: server_name domain.com www.domain.com;

Dacă în loc de -r folosiți opțiunea -R, comanda va urma toate legăturile simbolice:

$ -R domain.com / etc

Observați ultimul câmp de ieșire. Acest lucru nu este imprimat în exemplul de mai sus, deoarece fișierele din directorul Nginx activat de site-uri sunt legături simbolice la fișierele de configurare din directorul disponibil al site-urilor.

ieşire:

/etc/hosts:127.0.0.1 node2.domain.com

/etc/nginx/sites-available/domain.com: server_name domain.com www.domeniu.com;

/etc/nginx/sites-enabled/domain.com: nume_server domain.com www.domain.com;

Afișați numai numele fișierului

Pentru a suprima ieșirea implicită și pentru a tipări numai numele fișierelor care conțin modelul de potrivire, puteți introduce opțiunea -l (sau -file cu potrivire). De exemplu, pentru a căuta toate fișierele care se termină în .conf în directorul de lucru curent și pentru a imprima numai numele de fișiere care conțin tipul domain.com, tastați:

$ -L domain.com * .conf

Rezultatul va arata cam asa:

tmux.conf

haproxy.conf

Opțiunea -l este folosită de obicei împreună cu opțiunea recursivă -R:

$ -Rl domain.com / tmp

Sensibilitate la caz

În mod implicit, comanda este sensibilă la minuscule, ceea ce înseamnă că caracterele majuscule și minuscule sunt tratate ca fiind diferite. Pentru a ignora cazul atunci când căutați, introduceți opțiunea -i (sau -original). De exemplu, dacă căutați o Zebra fără nici o opțiune, următoarea comandă nu va afișa nici o ieșire, adică există potriviri.

$ Zebra / usr / share / words

Însă, dacă efectuați o căutare insensibilă la litere mici, utilizați opțiunea -i, se va potrivi atât litere mari cât și litere mici:

$ grep -i Zebra / usr / cota / cuvinte

Indicația "Zebra" va corespunde cu "Zebra", "ZEbrA" sau orice altă combinație de litere mari și minuscule.

ieşire:

zebră

Zebra

zebre

Cu potrivire exactă

Când căutați, gnu va imprima și gnu, în care se introduc cuvinte mai mari, cum ar fi cygnus sau magnum.

$ gnu / usr / share / cuvinte

ieşire:

Cygnus

gnu

interregn

lgnu9d

Lignum

sticlă mare de vin

Magnuson

sphagnum

Wingnut

Pentru a returna numai acele expresii în care câmpul specificat este un cuvânt întreg (nu este cuprins în cuvinte), puteți utiliza opțiunea -w (sau -word-regexp).

IMPORTANT. Caracterele cuvântului includ caractere alfanumerice (az, AZ și 0-9) și subliniere (_). Toate celelalte caractere sunt tratate ca caractere non-verbale.

Dacă executați aceeași comandă ca mai sus, inclusiv opțiunea -w, comanda va returna numai acelea care includ gnu ca cuvânt separat.

$ grep -w gnu / usr / cota / cuvinte

Ieșire: gnu

Afișați numere

Pentru a afișa numărul de linii care conțin un model, utilizați parametrul -n (sau linia-număr). Folosind această opțiune se imprimă potriviri la ieșirea standard cu prefixul numărului în care a fost găsit. De exemplu, pentru a afișa din fișierul / etc / services conținând prefixul bash cu numărul corespunzător, puteți utiliza următoarea comandă:

$ grep -n 10000 / etc / servicii

Rezultatul de mai jos arată că meciurile sunt la 10423 și 10424.

ieşire:

10423: ndmp 10.000 / tcp

10424: ndmp 10000 / udp

socoteală

Pentru a imprima numărul de linii de potrivire la ieșirea standard, utilizați parametrul -c (sau -count). În exemplul de mai jos, numărăm numărul de conturi care au shell / usr / bin / zsh.

$ grep -c '/ usr / bin / zsh' / etc / passwd

Ieșire: 4

Mai multe linii (modele)

Operatorul OR poate combina două sau mai multe modele de căutare. În mod implicit, comanda interpretează modelul ca expresie regulată principală, în care meta-caracterele își pierd înțelesul special, iar versiunile cu o lunetectură inversă ar trebui folosite. În exemplul de mai jos, căutăm toate aparițiile cuvintelor fatale, eroare și critice în fișierul jurnal de eroare Nginx:

$ grep 'fatal \ | eroare \ | critică' /var/log/nginx/error.log

Dacă utilizați opțiunea expresie regulată extinsă -E (sau -extended-regexp), instrucțiunea nu ar trebui să fie evadată, după cum se arată mai jos:

$ grep -E 'fatal | eroare | critică' /var/log/nginx/error.log

Expresie regulată

GNU Grep are două seturi de funcții de expresie regulată - Basic și Extended. În mod implicit, funcția interpretează modelul ca o expresie regulată de bază, pentru a comuta la expresii regulate extinse, trebuie să utilizați opțiunea -E. Când utilizați expresii regulate în modul principal, toate celelalte caractere, cu excepția metacaracterelor, sunt expresii regulate care corespund una cu cealaltă. Mai jos este o listă a celor mai frecvent utilizate metacaractere:

  • Folosiți caracterul ^ (caracterele) pentru a se potrivi cu expresia de la începutul unei linii. În exemplul următor, ^ kangaroo se va potrivi numai dacă apare chiar la început: $ grep "^ kangaroo" file.txt
  • Utilizați simbolul $ (dolar) pentru a se potrivi cu expresia de la sfârșit. În exemplul următor, cangurul $ se va potrivi numai dacă se întâlnește chiar la sfârșit: grep "kangaroo $" file.txt
  • Utilizați simbolul. (punct) pentru a potrivi un singur caracter. De exemplu, pentru a se potrivi tot ceea ce începe cu kan de două caractere și se termină cu roo, puteți folosi următorul model: $ grep "kan..roo" file.txt
  • Utilizați [] (paranteze) pentru a se potrivi cu orice caracter unic inclus în paranteze. De exemplu, găsiți cele care conțin acceptare sau "accent, puteți utiliza următorul model: $ grep" acce [np] t "file.txt

Pentru a evita semnificația specială a următorului caracter, utilizați caracterul \ (invers).

Expresii regulate extinse

Pentru a interpreta un model ca o expresie regulată extinsă, utilizați parametrul -E (sau -extensit-regexp). Expresiile regulate extinse includ toate metacaractele de bază, precum și metacaractele suplimentare pentru crearea de modele de căutare mai complexe și mai puternice. Mai jos sunt câteva exemple:

  • Potriviți și extrageți toate adresele de e-mail din acest fișier: $ grep -E -o "\ b [A-Za-z0-9 ._% + -] [A-Za-z0-9. \ [A-Za-z] {2.6} \ b "fișier.txt
  • Harta și extrage toate adresele IP valide din acest fișier: $ grep -E -o '(25 [0-5] | 2 [0-4] [0-9] | [01]? [0-9] [0 -9] a) (25 [0-5] | 2 [0-4] [0-9] | [01-] [0-9] [0-9] 5] | 2 [0-4] [0-9] | [01] a [0-9] [0-9] 9] | [01]? [0-9] [0-9]?) 'File.txt

Opțiunea -o este utilizată pentru imprimarea numai a potrivirilor.

Imprimare înainte de numărare

Pentru a imprima un anumit număr de linii înainte de potrivire, utilizați parametrul -B (sau - înainte-context). De exemplu, pentru a afișa 5 linii de context inițial înainte de potrivire, puteți utiliza următoarea comandă: $ grep -A 5 root / etc / passwd

Imprimare după căutare

Pentru a imprima un anumit număr de linii după o potrivire, utilizați parametrul -A (sau -after-context). De exemplu, pentru a afișa 5 linii din contextul final după potrivirea șirurilor, puteți folosi următoarea comandă: $ grep -B 5 root / etc / passwd

Toate acestea sunt necesare pentru utilizarea completă a informațiilor despre comenzi. Dacă utilizați deja Linux și puteți oferi sfaturi pentru începători, trimiteți comentarii în acest articol.