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.