Korrekt brug af Find og Grep-kommandoer i Linux

De fleste nybegyndere af Unix-systemer, især Linux, er ikke bekendt med de grundlæggende kommandolinjeoperatører, der anvendes i dette operativsystem. Lad os se nærmere på funktionerne og brugen af ​​find og grep operatørerne.

Brug Find og Grep kommandoer i Linux.

FIND

Linux find-kommandoen er et kommandolinjeværktøj til at krydse filhierarkiet. Det kan bruges til at søge efter filer og mapper og udføre efterfølgende operationer med dem. Den understøtter søgning efter fil, mappe, navn, oprettelsesdato, ændringsdato, ejer og tilladelser. Brug af -exec, andre UNIX-kommandoer kan udføres for fundne filer eller mapper. syntaks:

$ find [hvor skal man starte søgningen] [udtryk bestemmer hvad man skal finde] [-optioner] [hvad man finder]

muligheder:

  • -exec - den nødvendige fil, der opfylder ovenstående kriterier og returnerer 0 som en exit tilstand til succesfuld kommandoen udførelse;
  • -ok - fungerer det samme som -exec, bortset fra at brugeren først bliver bedt om det;
  • -inum N - søg med nummeret "N";
  • -links N - søgning med links "N";
  • -name demo - søg efter filer angivet i "demo";
  • -ny fil - søg efter filer, der er blevet ændret / oprettet efter "fil";
  • -perm oktal - søg om opløsningen er oktal;
  • -print - vis stien til de dokumenter, der blev fundet ved hjælp af de øvrige kriterier
  • -empty - Søg efter tomme dokumenter og mapper;
  • -size + N / -N - søge blokke "N"; "N" og "c" kan bruges til at måle størrelsen i tegn; "+ N" betyder en større størrelse af "N" -blokke, og "-N" betyder en mindre størrelse af "N" -blokke;
  • -bruger navn - søg efter dokumenter tilhørende brugernavnet eller identifikatoren "navn";
  • \ (expr \) - True hvis "expr" er sandt; Bruges til at gruppere kriterier i forbindelse med OR eller AND.

GREP

Grep-kommandoen bruges til at søge filer. Funktionen står for "global udskrivning af regulære udtryk" og er en af ​​de mest kraftfulde og hyppigt anvendte kommandoer i Linux. Kommandoen søger efter en eller flere inputfiler, der matcher det angivne mønster, og skriver hver tilsvarende linje til standard output. Hvis der ikke er angivet nogen filer, læser kommandoen fra standardindgangen, som normalt er output fra en anden kommando. I denne artikel vil vi vise dig, hvordan du indtaster en kommando med praktiske eksempler og detaljerede forklaringer på de mest almindelige GNU grep-muligheder.

Kommandosyntax

Før vi begynder at bruge kommandoen, lad os begynde med at gennemgå den grundlæggende syntaks. Nyttelsesudtrykene har følgende form:

[OPTIONS] PATTERN [FILE ...]

Varer i firkantede parenteser er valgfrie.

  • OPTIONS - nul eller flere valgmuligheder. Holdet giver en række muligheder, der styrer sin adfærd.
  • PATTERN - Søg mønster.
  • FIL - nul eller flere input filnavne.

Sådan indtastes en kommando for at søge filer

Hovedformålet med kommandoen er at søge efter tekst i filen. For eksempel at vise fra filen / etc / passwd, der indeholder bash-linjen, kan du bruge følgende kommando:

$ grep bash / etc / passwd

Udgangen skal se sådan ud:

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

domain1000: 1000: domain: / home / domain: / bin / bash

Hvis strengen indeholder mellemrum, skal du vedlægge den i enkelt eller dobbelt citater:

$ "Gnome Display Manager" / etc / passwd

Inverter Match (ex)

For at få vist linjer, der ikke passer til mønsteret, skal du indtaste parameteren -v (eller -invert-match). For eksempel at vise en fil, der ikke indeholder nologin fra filen / etc / passwd, kan du indtaste følgende kommando:

$ -v nologin / etc / passwd

Output:

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

kolonne 124: 124 :: / var / lib / kolord: / bin / false

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

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

Sådan bruger du kommandoen til at søge i output

I stedet kan du omdirigere output fra en anden kommando, hvis du angiver inputfiler, og kun viser de linjer, der matcher det angivne mønster. For at finde ud af, hvilke processer der kører på dit system som en www-data-bruger, kan du bruge følgende kommando:

$ ps -ef | www-data

Output:

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

root 18272 17714 0 16:00 pt / 0 00:00:00 -color = auto - ekskluder-dir = .bzr -exclude-dir = CVS -exclude-dir = .git -exclude-dir = .hg -exclude-dir = .svn www-data

www-data 31147 12770 0 okt22? 00:05:51 nginx: arbejdsproces

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

Du kan også kombinere flere kanaler til et hold. Som du kan se i udgangen ovenfor, er der også en linje, der indeholder processen. Hvis du ikke vil have denne linje vist, skal du sende output til en anden instans, som vist nedenfor.

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

Output:

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

root 18272 17714 0 16:00 pt / 0 00:00:00 -color = auto - ekskluder-dir = .bzr -exclude-dir = CVS -exclude-dir = .git -exclude-dir = .hg -exclude-dir = .svn www-data

www-data 31147 12770 0 okt22? 00:05:51 nginx: arbejdsproces

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

Rekursiv søgning

For at rekursivt søge efter et mønster skal du indtaste -r (eller -recursive) indstillingen. Dette giver dig mulighed for at søge gennem alle filerne i den angivne mappe og hoppe over symboliske links, der forekommer rekursivt. For at gå igennem alle symbolske links, brug alternativet -r (eller -reference-rekursiv). I det følgende eksempel søger vi efter domain.com i alle filer inde i mappen / etc:

$ -r domain.com / etc

Kommandoen udskriver de tilsvarende felter med det fulde filsti-præfiks.

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

Hvis i stedet for -r bruger alternativet -R, følger kommandoen alle symbolske links:

$ -R domain.com / etc

Bemærk det sidste uddatafelt. Dette udskrives ikke i eksemplet ovenfor, fordi filerne i Nginx-mappen, der er lokaliseret, er symbolske links til konfigurationsfiler inde i den tilgængelige mappe.

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;

Vis kun filnavn

For at undertrykke standard output og kun udskrive navne på filer, der indeholder det matchede mønster, kan du indtaste -l (eller -files-med-kampe) indstillingen. Hvis du for eksempel søger efter alle filer, der slutter i .conf i den aktuelle arbejdsmappe og kun udskriver filnavne, der indeholder domain.com-typen, skal du skrive:

$ -L domain.com * .conf

Udgangen vil se sådan ud:

tmux.conf

haproxy.conf

Alternativet -l bruges normalt i forbindelse med rekursiv -R-indstillingen:

$ -Rl domain.com / tmp

Case ufølsomhed

Kommandoen er som standard hovedtekstfølsom, hvilket betyder at store og små bogstaver behandles som forskellige. For at ignorere tilfælde, når du søger, skal du indtaste -i (eller -ignore-case) -alternativet. Hvis du for eksempel søger efter en Zebra uden nogen valg, vil den følgende kommando ikke vise nogen output, dvs. der er matchende.

$ Zebra / usr / del / ord

Men hvis du udfører en case-insensitive søgning, skal du bruge -i-indstillingen, den passer til både store og små bogstaver:

$ grep -i Zebra / usr / del / ord

Indikationen "Zebra" svarer til "Zebra", "ZEbrA" eller en anden kombination af store og små bogstaver.

Output:

zebra

zebra

zebraer

Præcis kamp

Ved søgning vil gnu også udskrive gnu, hvori større ord indsættes, såsom cygnus eller magnum.

$ gnu / usr / share / words

Output:

cygnus

gnu

interregnum

lgnu9d

lignum

magnum

Magnuson

sphagnum

wingnut

For kun at returnere de udtryk, hvor det angivne felt er et helt ord (ikke vedlagt i ord), kan du bruge -w-indstillingen (eller -word-regexp).

VIGTIGT. Ordets tegn indeholder alfanumeriske tegn (az, AZ og 0-9) og understregninger (_). Alle andre tegn behandles som ikke-verbale tegn.

Hvis du kører samme kommando som ovenfor, herunder -w-indstillingen, returnerer kommandoen kun de, der indeholder gnu som et særskilt ord.

$ grep -w gnu / usr / del / ord

Output: gnu

Vis numre

For at vise antallet af linjer, der indeholder et mønster, skal du bruge parameteren -n (eller -linjenummer). Ved hjælp af denne indstilling udskrives matchninger til standardudgangen med præfikset for det nummer, hvori det blev fundet. For eksempel at vise fra filen / etc / services, der indeholder bash-prefixet med det tilsvarende nummer, kan du bruge følgende kommando:

$ grep -n 10000 / etc / services

Udgangen nedenfor viser, at kampene er på 10423 og 10424.

Output:

10423: ndmp 10.000 / tcp

10424: ndmp 10000 / udp

tælle

For at udskrive antallet af matchende linjer til standard output, brug parameteren -c (eller -count). I eksemplet nedenfor tæller vi antallet af konti, der har shell / usr / bin / zsh.

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

Udgang: 4

Flere linjer (mønstre)

OR-operatøren kan kombinere to eller flere søgemønstre |. Som standard fortolker kommandoen mønsteret som det primære regulære udtryk, hvor metat karakterer mister deres særlige betydning, og deres versioner med tilbageslag skal bruges. I eksemplet nedenfor søger vi efter alle forekomster af ordene fatale, fejl og kritiske i Nginx-fejllogfilen:

$ grep 'fatalt \ | fejl \ | kritisk' /var/log/nginx/error.log

Hvis du bruger den udvidede regulære ekspressionsindstilling -E (eller -extended-regexp), skal opgørelsen ikke undslippes, som vist nedenfor:

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

Regelmæssigt udtryk

GNU Grep har to sæt regulære ekspressionsfunktioner - Basic og Extended. Som standard tolker funktionen mønsteret som et grundlæggende regulært udtryk, for at skifte til udvidede regulære udtryk, skal du bruge -E-indstillingen. Når du bruger regulære udtryk i hovedtilstanden, er alle andre tegn, undtagen metategn, faktisk regelmæssige udtryk, som svarer til hinanden. Nedenfor er en liste over de mest anvendte meta tegn:

  • Brug ^ karakteren (karet karakteren) til at matche udtrykket i begyndelsen af ​​en linje. I det følgende eksempel vil ^ kangaroo kun matche, hvis det sker i begyndelsen: $ grep "^ kangaroo" file.txt
  • Brug $ (dollar) symbolet til at matche udtrykket i slutningen. I det følgende eksempel vil kangaroo $ kun matche, hvis det findes i slutningen: grep "kangaroo $" file.txt
  • Brug symbolet. (punkt) for at matche ethvert enkelt tegn. For eksempel at matche alt, der begynder med kan med to tegn og ender med roo, kan du bruge følgende mønster: $ grep "kan..roo" file.txt
  • Brug [] (parenteser) til at matche et enkelt tegn vedlagt i parenteser. Find f.eks. Dem, der indeholder accept eller "accent, du kan bruge følgende mønster: $ grep" acce [np] t "file.txt

For at undgå den særlige betydning af det næste tegn, brug \ (backslash) karakteren.

Udvidede regulære udtryk

For at fortolke et mønster som et udvidet regulært udtryk skal du bruge parameteren -E (eller -extended-regexp). Udvidede regulære udtryk omfatter alle grundlæggende metakarakterer samt yderligere metategn for at skabe mere komplekse og kraftfulde søgemønstre. Nedenfor er nogle eksempler:

  • Match og udtrække alle e-mailadresser fra denne fil: $ grep -E -o "\ b [A-Za-z0-9 ._% + -] [A-Za-z0-9 .-] + \. [A-Za-z] {2.6} \ b "file.txt
  • Kort og hent alle gyldige IP-adresser fra denne fil: $ 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]?) 'File.txt

Den -o indstilling bruges til at udskrive kun kampe.

Udskriv før tællingen

Hvis du vil udskrive et bestemt antal linjer, før du matcher, skal du bruge parameteren -B (eller -for-kontekst). For eksempel at vise 5 linjer af indledende kontekst før matchning, kan du bruge følgende kommando: $ grep -A 5 root / etc / passwd

Udskriv efter søgning

Hvis du vil udskrive et bestemt antal linjer efter en kamp, ​​skal du bruge parameteren -A (eller -kontekst). For eksempel at vise 5 linjer i den endelige kontekst efter matchende strenge, kan du bruge følgende kommando: $ grep -B 5 root / etc / passwd

Dette er alt nødvendigt for fuld brug af kommandoer information. Hvis du allerede bruger Linux og kan give noget råd til begyndere, kan du dele kommentarer under denne artikel.