Correct gebruik van Find- en Grep-opdrachten in Linux

De meeste beginnende gebruikers van Unix-systemen, met name Linux, zijn niet bekend met de basis commandoregel-operatoren die in dit OS worden gebruikt. Laten we de functies en het gebruik van de find- en grep-operators nader bekijken.

Zoek- en Grep-opdrachten gebruiken in Linux.

VINDEN

De Linux find-opdracht is een opdrachtregelhulpprogramma voor het doorlopen van de bestandshiërarchie. Het kan worden gebruikt om bestanden en mappen te zoeken en daaropvolgende bewerkingen met ze uit te voeren. Het ondersteunt zoeken op bestand, map, naam, aanmaakdatum, wijzigingsdatum, eigenaar en machtigingen. Met behulp van -exec kunnen andere UNIX-opdrachten worden uitgevoerd voor gevonden bestanden of mappen. syntax:

$ vind [waar te beginnen met zoeken] [uitdrukking bepaalt wat te vinden] [-opties] [wat te vinden]

opties:

  • -exec - het vereiste bestand dat aan de bovenstaande criteria voldoet en retourneert 0 als uitgangsstatus voor het uitvoeren van de geslaagde opdracht;
  • -ok - werkt hetzelfde als -exec, behalve dat de gebruiker eerst wordt gevraagd;
  • -inum N - zoeken met het getal "N";
  • -links N - zoek met koppelingen "N";
  • -name demo - zoek naar bestanden gespecificeerd in "demo";
  • -nieuwer bestand - zoeken naar bestanden die zijn gewijzigd / gemaakt na "bestand";
  • -perm octaal - zoek of de resolutie octaal is;
  • -print - toon het pad naar de gevonden documenten met behulp van de andere criteria;
  • -empty - zoeken naar lege documenten en mappen;
  • -size + N / -N - zoekblokken "N"; "N" en "c" kunnen worden gebruikt om de grootte in tekens te meten; "+ N" betekent een groter formaat van "N" -blokken, en "-N" betekent een kleiner aantal "N" -blokken;
  • -gebruikersnaam - zoek naar documenten die horen bij de gebruikersnaam of de identifier "name";
  • \ (uitdr \) - Waar als "expr" waar is; Wordt gebruikt om criteria te groeperen in combinatie met OR of AND.

GREP

De grep-opdracht wordt gebruikt om bestanden te zoeken. De functie staat voor 'global printing of regular expressions' en is een van de krachtigste en meest gebruikte opdrachten in Linux. De opdracht zoekt naar een of meer invoerbestanden die overeenkomen met het opgegeven patroon en schrijft elke bijbehorende regel naar standaarduitvoer. Als er geen bestanden zijn opgegeven, leest de opdracht uit de standaardinvoer, meestal de uitvoer van een andere opdracht. In dit artikel laten we je zien hoe je een commando invoert, met praktische voorbeelden en gedetailleerde uitleg van de meest voorkomende GNU grep-opties.

Commandosyntaxis

Voordat we de opdracht gaan gebruiken, laten we beginnen met het bekijken van de basissyntaxis. De hulpprogramma-uitdrukkingen hebben de volgende vorm:

[OPTIES] PATROON [BESTAND ...]

Items tussen vierkante haken zijn optioneel.

  • OPTIES - nul of meer keuzes. Het team biedt een aantal opties die het gedrag ervan beheersen.
  • PATROON - Zoekpatroon.
  • BESTAND - nul of meer ingevoerde bestandsnamen.

Hoe een commando in te voeren om bestanden te doorzoeken

Het belangrijkste doel van het commando is om te zoeken naar tekst in het bestand. Als u bijvoorbeeld wilt weergeven vanuit het bestand / etc / passwd dat de bash-regel bevat, kunt u de volgende opdracht gebruiken:

$ grep bash / etc / passwd

De uitvoer zou er ongeveer zo uit moeten zien:

root 0: 0: root: / root: / bin / bash

domain1000: 1000: domein: / home / domein: / bin / bash

Als de tekenreeks spaties bevat, moet u deze insluiten in enkele of dubbele aanhalingstekens:

$ "Gnome Display Manager" / etc / passwd

Wedstrijd omkeren (ex)

Om lijnen weer te geven die niet overeenkomen met het patroon, voert u de parameter -v (of -invert-match) in. Als u bijvoorbeeld een bestand zonder nologine uit het bestand / etc / passwd wilt weergeven, voert u de volgende opdracht in:

$ -v nologin / etc / passwd

Output:

root 0: 0: root: / root: / bin / bash

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

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

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

Hoe de opdracht te gebruiken om in de uitvoer te zoeken

Als u daarentegen invoerbestanden opgeeft, kunt u de uitvoer van een andere opdracht omleiden en vervolgens alleen de regels weergeven die overeenkomen met het opgegeven patroon. Als u bijvoorbeeld wilt weten welke processen op uw systeem als www-gegevensgebruiker worden uitgevoerd, gebruikt u de volgende opdracht:

$ ps -ef | www-data

Output:

www-data 18247 12675 4 16:00? 00:00:00 php-fpm: zwembad www

root 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-data

www-data 31147 12770 0 Oct22? 00:05:51 nginx: werkproces

www-data 31148 12770 0 Oct22? 00:00:00 nginx: cache manager-proces

Je kunt ook meerdere kanalen combineren in een team. Zoals je kunt zien in de bovenstaande uitvoer, is er ook een regel met het proces. Als u niet wilt dat deze regel wordt weergegeven, verzendt u de uitvoer naar een andere instantie, zoals hieronder wordt weergegeven.

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

Output:

www-data 18247 12675 4 16:00? 00:00:00 php-fpm: zwembad www

root 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-data

www-data 31147 12770 0 Oct22? 00:05:51 nginx: werkproces

www-data 31148 12770 0 Oct22? 00:00:00 nginx: cache manager-proces

Recursief zoeken

Om recursief naar een patroon te zoeken, voert u de optie -r (of -recursief) in. Hiermee kunt u alle bestanden in de opgegeven map doorzoeken en symbolische koppelingen overslaan die recursief voorkomen. Gebruik de optie -r (of -dereference-recursive) om alle symbolische koppelingen te doorlopen. In het volgende voorbeeld zijn we op zoek naar domain.com in alle bestanden in de map / etc:

$ -r domein.com / etc

De opdracht drukt de overeenkomstige velden af ​​met de prefix van het volledige pad.

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

Als u in plaats van -r de optie -R gebruikt, volgt de opdracht alle symbolische koppelingen:

$ -R domain.com / etc

Let op het laatste uitvoerveld. Dit wordt niet in het bovenstaande voorbeeld afgedrukt, omdat de bestanden in de Nginx-directory met sites symbolische koppelingen zijn naar configuratiebestanden in de map met beschikbare sites.

Output:

/etc/hosts:127.0.0.1 node2.domain.com

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

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

Toon alleen bestandsnaam

Om de standaarduitvoer te onderdrukken en alleen de namen van bestanden met het overeenkomende patroon af te drukken, kunt u de optie -l (of -files-with-matches) invoeren. Als u bijvoorbeeld wilt zoeken naar alle bestanden die eindigen op .conf in de huidige werkmap en alleen bestandsnamen wilt afdrukken die het type domain.com bevatten, typt u:

$ -L domein.com * .conf

De uitvoer ziet er ongeveer zo uit:

tmux.conf

haproxy.conf

De optie -l wordt meestal gebruikt in combinatie met de optie recursief-R:

$ -Rl domein.com / tmp

Hoofdlettergevoeligheid

Standaard is de opdracht hoofdlettergevoelig, wat betekent dat hoofdletters en kleine letters als verschillend worden behandeld. Als u een geval wilt negeren tijdens het zoeken, voert u de optie -i (of -tekenreeks) in. Als u bijvoorbeeld naar een Zebra zonder enige optie zoekt, geeft de volgende opdracht geen uitvoer weer, d.w.z. er zijn matching.

$ Zebra / usr / share / words

Maar als u een niet-hoofdlettergevoelige zoekopdracht uitvoert, gebruikt u de optie -i, deze komt overeen met hoofdletters en kleine letters:

$ grep -i Zebra / usr / share / words

De aanduiding "Zebra" komt overeen met "Zebra", "ZEbrA" of een andere combinatie van hoofdletters en kleine letters.

Output:

zebra

zebra's

zebra's

Exacte overeenkomst

Tijdens het zoeken zal gnu ook gnu afdrukken, waarin grotere woorden worden ingevoegd, zoals cygnus of magnum.

$ gnu / usr / share / words

Output:

Cygnus

gnoe

interregnum

lgnu9d

lignum

magnum

Magnuson

veenmos

wingnut

Als u alleen die uitdrukkingen wilt retourneren waarin het opgegeven veld een heel woord is (niet omsloten door woorden), kunt u de optie -w (of -word-regexp) gebruiken.

BELANGRIJK. De tekens van het woord bevatten alfanumerieke tekens (az, AZ en 0-9) en underscores (_). Alle andere tekens worden behandeld als non-verbale tekens.

Als u dezelfde opdracht uitvoert als hierboven, inclusief de optie -w, retourneert de opdracht alleen die met GNU als een afzonderlijk woord.

$ grep -w gnu / usr / share / words

Uitgang: GNU

Toon nummers

Als u het aantal regels met een patroon wilt weergeven, gebruikt u de parameter -n (of -lineaantal). Als u deze optie gebruikt, worden overeenkomsten afgedrukt met de standaarduitvoer met het voorvoegsel van het nummer waarin het is gevonden. Als u bijvoorbeeld vanuit het bestand / etc / services met de bash-prefix wilt weergeven met het overeenkomende nummer, kunt u de volgende opdracht gebruiken:

$ grep -n 10000 / etc / services

De onderstaande output laat zien dat de matches op 10423 en 10424 zijn.

Output:

10423: ndmp 10.000 / tcp

10424: ndmp 10000 / udp

telling

Gebruik de parameter -c (of -telling) om het aantal overeenkomende regels naar standaarduitvoer af te drukken. In het onderstaande voorbeeld tellen we het aantal accounts dat de shell / usr / bin / zsh heeft.

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

Output: 4

Verschillende lijnen (patronen)

De operator OR kan twee of meer zoekpatronen | combineren. Standaard interpreteert de opdracht het patroon als de hoofd reguliere expressie, waarbij metacharacters hun specifieke betekenis verliezen en hun versies met een backslash moeten worden gebruikt. In het onderstaande voorbeeld zoeken we naar alle exemplaren van de woorden fataal, fout en kritiek in het foutlogbestand van Nginx:

$ grep 'fatale \ | error \ | critical' /var/log/nginx/error.log

Als u de uitgebreide expressie-optie -E (of -extended-regexp) gebruikt, mag de instructie niet worden geëscaped, zoals hieronder wordt weergegeven:

$ grep -E 'fatale | error | critical' /var/log/nginx/error.log

Reguliere expressie

GNU Grep heeft twee sets reguliere expressiefuncties: Basic en Extended. Standaard interpreteert de functie het patroon als een standaard reguliere expressie, om over te schakelen naar uitgebreide reguliere expressies, moet u de optie -E gebruiken. Wanneer u reguliere expressies in de hoofdmodus gebruikt, zijn alle andere tekens, behalve metatekens, in feite reguliere expressies die met elkaar overeenkomen. Hieronder is een lijst van de meest gebruikte metatekens:

  • Gebruik het ^ -teken (het caret-teken) om de uitdrukking aan het begin van een regel overeen te laten komen. In het volgende voorbeeld komt ^ kangaroo alleen overeen als deze helemaal aan het begin voorkomt: $ grep "^ kangaroo" file.txt
  • Gebruik het $ (dollar) -symbool om de uitdrukking aan het einde aan te passen. In het volgende voorbeeld zal kangaroo $ alleen overeenkomen als het helemaal aan het einde staat: grep "kangaroo $" file.txt
  • Gebruik het symbool. (punt) om elk willekeurig teken te evenaren. Als u bijvoorbeeld alles wilt matchen dat begint met kan van twee tekens en eindigt met roo, kunt u het volgende patroon gebruiken: $ grep "kan..roo" file.txt
  • Gebruik [] (haakjes) om elk willekeurig teken tussen haakjes te matchen. Zoek bijvoorbeeld naar degene die accepteren of "accentueren, u kunt het volgende patroon gebruiken: $ grep" acce [np] t "file.txt

Gebruik het teken \ (backslash) om de speciale betekenis van het volgende teken te vermijden.

Uitgebreide reguliere expressies

Als u een patroon wilt interpreteren als een uitgebreide reguliere expressie, gebruikt u de parameter -E (of -extended-regexp). Uitgebreide reguliere expressies bevatten alle elementaire metatekens en extra metatekens voor het maken van complexere en krachtigere zoekpatronen. Hieronder zijn enkele voorbeelden:

  • Overeenkomen en extraheren van alle e-mailadressen uit dit bestand: $ grep -E -o "\ b [A-Za-z0-9 ._% + -] [A-Za-z0-9 .-] + \. [A-Za-z] {2.6} \ b "file.txt
  • Wijs en extraheer alle geldige IP-adressen uit dit bestand: $ grep -E -o '(25 [0-5] | 2 [0-4] [0-9] | [01]? [0-9] [0 -9]?) \. (25 [0-5] | 2 [0-4] [0-9] | [01]? [0-9] [0-9]?) \. (25 [0- 5] | 2 [0-4] [0-9] | [01]? [0-9] [0-9]?) \. (25 [0-5] | 2 [0-4] [0- 9] | [01]? [0-9] [0-9]?) 'Bestand.txt

De optie -o wordt gebruikt om alleen overeenkomsten af ​​te drukken.

Afdrukken vóór het tellen

Als u een bepaald aantal regels wilt afdrukken voordat u ze vergelijkt, gebruikt u de parameter -B (of -voor de context). Als u bijvoorbeeld 5 regels initiële context wilt weergeven voordat deze worden gevonden, kunt u de volgende opdracht gebruiken: $ grep -A 5 root / etc / passwd

Afdrukken na zoeken

Gebruik de parameter -A (of -after-context) om een ​​specifiek aantal regels na een overeenkomst af te drukken. Als u bijvoorbeeld 5 regels van de definitieve context na overeenkomende tekenreeksen wilt weergeven, kunt u de volgende opdracht gebruiken: $ grep -B 5 root / etc / passwd

Dit is allemaal nodig voor het volledige gebruik van opdrachteninformatie. Als je Linux al gebruikt en advies kunt geven aan beginners, deel dan reacties op dit artikel.