Cum să utilizați comanda grep pe Linux
Publicat: 2022-01-29 Comanda Linux grep
este un utilitar de potrivire a șirurilor și a modelelor care afișează linii care se potrivesc din mai multe fișiere. Funcționează, de asemenea, cu ieșirea canalizată de la alte comenzi. Vă arătăm cum.
Povestea din spatele grep
Comanda grep
este renumită în cercurile Linux și Unix din trei motive. În primul rând, este extrem de util. În al doilea rând, multitudinea de opțiuni poate fi copleșitoare. În al treilea rând, a fost scris peste noapte pentru a satisface o anumită nevoie. Primele două sunt bang on; al treilea este ușor dezactivat.
Ken Thompson extrasese capabilitățile de căutare a expresiilor obișnuite din editorul ed
(pronunțat ee-dee) și crease un mic program - pentru uzul său - pentru a căuta prin fișiere text. Șeful său de departament de la Bell Labs, Doug Mcilroy, l-a abordat pe Thompson și a descris problema cu care se confruntă unul dintre colegii săi, Lee McMahon.
McMahon încerca să identifice autorii lucrărilor federaliste prin analiză textuală. Avea nevoie de un instrument care să poată căuta expresii și șiruri de caractere în fișierele text. Thompson a petrecut aproximativ o oră în acea seară făcând instrumentul său un utilitar general care ar putea fi folosit de alții și l-a redenumit grep
. El a luat numele din șirul de comandă ed
g/re/p
, care se traduce prin „căutare globală a expresiilor regulate”.
Îl poți urmări pe Thompson vorbind cu Brian Kernighan despre nașterea grep
.
Căutări simple cu grep
Pentru a căuta un șir într-un fișier, treceți termenul de căutare și numele fișierului pe linia de comandă:
Sunt afișate liniile care se potrivesc. În acest caz, este o singură linie. Textul potrivit este evidențiat. Acest lucru se datorează faptului că în majoritatea distribuțiilor grep
este alias cu:
alias grep='grep --colour=auto'
Să ne uităm la rezultatele în care există mai multe linii care se potrivesc. Vom căuta cuvântul „Medie” într-un fișier jurnal al aplicației. Deoarece nu ne putem aminti dacă cuvântul este cu litere mici în fișierul jurnal, vom folosi opțiunea -i
(ignora majuscule):
grep -i Geek mediu-1.log
Fiecare linie care se potrivește este afișată, cu textul potrivit evidențiat în fiecare.
Putem afișa liniile care nu se potrivesc folosind opțiunea -v (potrivire inversă).
grep -v Mem geek-1.log
Nu există nicio evidențiere, deoarece acestea sunt liniile care nu se potrivesc.
Putem determina grep
să tacă complet. Rezultatul este transmis shell-ului ca valoare returnată de la grep
. Un rezultat de zero înseamnă că șirul a fost găsit, iar un rezultat de unu înseamnă că nu a fost găsit. Putem verifica codul de retur folosind $?
parametri speciali:
grep -q medie geek-1.log
eco $?
grep -q howtogeek geek-1.log
eco $?
Căutări recursive cu grep
Pentru a căuta prin directoare și subdirectoare imbricate, utilizați opțiunea -r (recursivă). Rețineți că nu furnizați un nume de fișier pe linia de comandă, trebuie să furnizați o cale. Aici căutăm în directorul curent „.” și orice subdirectoare:
grep -r -i memfree .
Ieșirea include directorul și numele de fișier al fiecărei linii de potrivire.
Putem face grep
să urmeze legături simbolice utilizând opțiunea -R
(recursive dereference). Avem o legătură simbolică în acest director, numit logs-folder
. Indică către /home/dave/logs
.
ls -l jurnal-folder
Să repetăm ultima noastră căutare cu opțiunea -R
(recursive dereference):
grep -R -i memfree .
Legătura simbolică este urmată și directorul către care indică este căutat și de grep
.
Căutarea cuvintelor întregi
În mod implicit, grep
va potrivi o linie dacă ținta de căutare apare oriunde în acea linie, inclusiv în interiorul unui alt șir. Uită-te la acest exemplu. Vom căuta cuvântul „liber”.
grep -i free geek-1.log
Rezultatele sunt linii care au șirul „liber” în ele, dar nu sunt cuvinte separate. Ele fac parte din șirul „MemFree”.
Pentru a forța grep
să se potrivească numai cu „cuvinte” separate, utilizați opțiunea -w
(exp. regul cuvântului).
grep -w -i free geek-1.log
eco $?
De data aceasta nu există rezultate deoarece termenul de căutare „gratuit” nu apare în fișier ca un cuvânt separat.
Utilizarea mai multor termeni de căutare
Opțiunea -E
(extended regexp) vă permite să căutați mai multe cuvinte. (Opțiunea -E
înlocuiește versiunea egrep
depreciată a grep
.)
Această comandă caută doi termeni de căutare, „medie” și „memfree”.
grep -E -w -i "medie|memfree" geek-1.log
Toate liniile care se potrivesc sunt afișate pentru fiecare dintre termenii de căutare.
De asemenea, puteți căuta mai mulți termeni care nu sunt neapărat cuvinte întregi, dar pot fi și cuvinte întregi.
Opțiunea -e
(modele) vă permite să utilizați mai mulți termeni de căutare pe linia de comandă. Folosim funcția de paranteză pentru expresii regulate pentru a crea un model de căutare. Îi spune grep
să se potrivească cu oricare dintre caracterele cuprinse între paranteze „[]”. Aceasta înseamnă că grep
va potrivi fie „kB” fie „KB” în timp ce caută.
Ambele șiruri sunt potrivite și, de fapt, unele linii conțin ambele șiruri.
Liniile care se potrivesc exact
-x
(linia regexp) va potrivi numai liniile în care întreaga linie se potrivește cu termenul de căutare. Să căutăm o ștampilă de dată și oră despre care știm că apar o singură dată în fișierul jurnal:
grep -x "20-Jan--06 15:24:35" geek-1.log
Singura linie care se potrivește este găsită și afișată.
Opusul este doar arătarea liniilor care nu se potrivesc. Acest lucru poate fi util atunci când vă uitați la fișierele de configurare. Comentariile sunt grozave, dar uneori este greu de găsit setările reale printre toate. Iată /etc/sudoers
:
Putem filtra eficient rândurile de comentarii astfel:
sudo grep -v "#" /etc/sudoers
Este mult mai ușor de analizat.
Se afișează numai textul care se potrivește
Poate exista o ocazie în care nu doriți să vedeți întreaga linie de potrivire, doar textul potrivit. Opțiunea -o
(doar potrivire) face exact asta.
grep -o MemFree geek-1.log
Afișajul este redus la afișarea doar a textului care se potrivește cu termenul de căutare, în loc de întreaga linie de potrivire.
Numărând cu grep
grep
nu este doar despre text, poate oferi și informații numerice. Putem face ca grep
să conteze pentru noi în diferite moduri. Dacă vrem să știm de câte ori apare un termen de căutare într-un fișier, putem folosi opțiunea -c
(numărare).
grep -c medie geek-1.log
grep
raportează că termenul de căutare apare de 240 de ori în acest fișier.
Puteți face ca grep
să afișeze numărul de linie pentru fiecare linie potrivită utilizând opțiunea -n
(număr de linie).
grep -n Jan geek-1.log
Numărul de linie pentru fiecare linie potrivită este afișat la începutul liniei.
Pentru a reduce numărul de rezultate care sunt afișate, utilizați opțiunea -m
(număr maxim). Vom limita rezultatul la cinci linii de potrivire:
grep -m5 -n Jan geek-1.log
Adăugarea contextului
Este adesea util să poți vedea câteva linii suplimentare - eventual linii care nu se potrivesc - pentru fiecare linie care se potrivește. vă poate ajuta să distingeți care dintre liniile potrivite sunt cele care vă interesează.
Pentru a afișa unele linii după linia potrivită, utilizați opțiunea -A (după context). Solicităm trei rânduri în acest exemplu:
grep -A 3 -x "20-ian-06 15:24:35" geek-1.log
Pentru a vedea unele linii dinaintea liniei de potrivire, utilizați opțiunea -B
(context înainte).
grep -B 3 -x "20-ian-06 15:24:35" geek-1.log
Și pentru a include linii de înainte și după linia de potrivire, utilizați opțiunea -C
(context).
grep -C 3 -x "20-ian-06 15:24:35" geek-1.log
Se afișează fișierele care se potrivesc
Pentru a vedea numele fișierelor care conțin termenul de căutare, utilizați opțiunea -l
(fișiere cu potrivire). Pentru a afla ce fișiere de cod sursă C conțin referințe la fișierul antet sl.h
, utilizați această comandă:
grep -l "sl.h" *.c
Numele fișierelor sunt listate, nu liniile care se potrivesc.
Și, desigur, putem căuta fișiere care nu conțin termenul de căutare. Opțiunea -L
(fișiere fără potrivire) face exact asta.
grep -L "sl.h" *.c
Începutul și sfârșitul liniilor
Putem forța grep
să afișeze numai potrivirile care sunt fie la începutul, fie la sfârșitul unei linii. Operatorul expresiei regulate „^” se potrivește cu începutul unei linii. Practic, toate liniile din fișierul jurnal vor conține spații, dar vom căuta linii care au un spațiu ca prim caracter:
grep "^ " geek-1.log
Liniile care au un spațiu ca prim caracter — la începutul liniei — sunt afișate.
Pentru a se potrivi la sfârșitul liniei, utilizați operatorul de expresie regulată „$”. Vom căuta linii care se termină cu „00”.
grep "00$" geek-1.log
Afișajul arată liniile care au „00” drept caractere finale.
Folosind Pipes cu grep
Desigur, puteți canaliza intrarea către grep
, puteți canaliza ieșirea de la grep
într-un alt program și puteți avea grep
amplasat în mijlocul unui lanț de conducte.
Să presupunem că vrem să vedem toate aparițiile șirului „ExtractParameters” în fișierele noastre de cod sursă C. Știm că vor fi destul de multe, așa că direcționăm rezultatul în less
:
grep „ExtractParameters” *.c | Mai puțin
Ieșirea este prezentată în less
.
Acest lucru vă permite să navigați prin lista de fișiere și să utilizați facilitatea less's
.
Dacă trimitem rezultatul de la grep
în wc
și folosim opțiunea -l
(linii), putem număra numărul de linii din fișierele de cod sursă care conțin „ExtractParameters”. (Am putea realiza acest lucru utilizând opțiunea grep
-c
(număr), dar aceasta este o modalitate bună de a demonstra piperea din grep
.)
grep „ExtractParameters” *.c | wc -l
Cu următoarea comandă, trimitem ieșirea de la ls
în grep
și transmitem ieșirea de la grep
în sort
. Enumerăm fișierele din directorul curent, le selectăm pe cele cu șirul „Aug” în ele și le sortăm după dimensiunea fișierului:
ls -l | grep "Aug" | sortați +4n
Să descompunem asta:
- ls -l : Efectuați o listă lungă a fișierelor folosind
ls
. - grep „Aug” : Selectați liniile din lista
ls
care au „Aug” în ele. Rețineți că acest lucru ar găsi și fișiere care au „Aug” în numele lor. - sort +4n : Sortați rezultatul din grep pe a patra coloană (dimensiunea fișierului).
Obținem o listă sortată a tuturor fișierelor modificate în august (indiferent de an), în ordinea crescătoare a dimensiunii fișierului.
LEGATE: Cum să utilizați pipe pe Linux
grep: Mai puțin o comandă, mai mult un aliat
grep
este un instrument grozav pe care îl aveți la dispoziție. Datează din 1974 și încă merge puternic pentru că avem nevoie de ceea ce face și nimic nu o face mai bine.
Cuplarea grep
cu niște expresii regulate-fu chiar duce la următorul nivel.
RELATE: Cum să utilizați expresiile regulate de bază pentru a căuta mai bine și pentru a economisi timp
Comenzi Linux | ||
Fișiere | tar · pv · cat · tac · chmod · grep · diff · sed · ar · om · pushd · popd · fsck · testdisk · seq · fd · pandoc · cd · $PATH · awk · join · jq · fold · uniq · journalctl · tail · stat · ls · fstab · echo · less · chgrp · chown · rev · look · strings · tip · redenumire · zip · dezarhivare · montare · demontare · instalare · fdisk · mkfs · rm · rmdir · rsync · df · gpg · vi · nano · mkdir · du · ln · patch · convert · rclone · shred · srm | |
Procese | alias · ecran · sus · frumos · renice · progres · strace · systemd · tmux · chsh · istoric · la · lot · gratuit · care · dmesg · chfn · usermod · ps · chroot · xargs · tty · pinky · lsof · vmstat · timeout · wall · da · kill · sleep · sudo · su · time · groupadd · usermod · grupuri · lshw · shutdown · repornire · stop · poweroff · passwd · lscpu · crontab · data · bg · fg | |
Rețele | netstat · ping · traceroute · ip · ss · whois · fail2ban · bmon · dig · finger · nmap · ftp · curl · wget · who · whoami · w · iptables · ssh-keygen · ufw |
LEGATE: Cele mai bune laptopuri Linux pentru dezvoltatori și entuziaști