Com s'utilitza l'ordre grep a Linux
El Linux grep
command és una utilitat de concordança de patrons i cadenes que mostra les línies coincidents de diversos fitxers. També funciona amb sortida canalitzada d'altres ordres. Us mostrem com fer-ho.
La història darrere de grep
El grep
La comanda és famosa als cercles Linux i Unix per tres motius. En primer lloc, és tremendament útil. En segon lloc, la riquesa d’opcions pot ser aclaparadora. En tercer lloc, es va escriure d'un dia per l'altre per satisfer una necessitat particular. Els dos primers són bang on; el tercer està lleugerament apagat.
Ken Thompson havia extret les funcions de cerca d 'expressions regulars de ed
editor (pronunciat ee-dee) i va crear un petit programa —per al seu ús— per fer cerques a través de fitxers de text. El seu cap de departament a Bell Labs, Doug Mcilroy, es va apropar a Thompson i va descriure el problema que tenia un dels seus companys, Lee McMahon.
McMahon intentava identificar els autors dels articles federalistes mitjançant anàlisis textuals. Necessitava una eina que pogués cercar frases i cadenes dins de fitxers de text. Thompson va passar aproximadament una hora aquella nit fent de la seva eina una utilitat general que altres podien utilitzar i la va canviar com a nom grep
. Va prendre el nom del ed
cadena d'ordres g / re / p
, que es tradueix com a "cerca global d'expressions regulars".
Podeu veure Thompson parlar amb Brian Kernighan sobre el naixement de grep
.
Cerques simples amb grep
Per cercar una cadena dins d'un fitxer, passeu el terme de cerca i el nom del fitxer a la línia d'ordres:
Es mostren les línies coincidents. En aquest cas, es tracta d’una línia única. El text coincident es ressalta. Això es deu a la majoria de distribucions grep
té un àlies de:
àlies grep = "grep --colour = auto"
Vegem els resultats en què hi ha diverses línies que coincideixen. Cercarem la paraula "Mitjana" en un fitxer de registre de l'aplicació. Com que no recordem si la paraula està en minúscula al fitxer de registre, farem servir el fitxer -i
opció (ignorar majúscules i minúscules):
grep -i Geek-1.log mitjà
Es mostren totes les línies coincidents, amb el text coincident ressaltat a cada una.
Podem mostrar les línies que no coincideixen mitjançant l’opció -v (coincidència invertida).
grep -v Mem geek-1.log
No hi ha cap ressaltat perquè aquestes són les línies que no coincideixen.
Podem causar grep
estar completament en silenci. El resultat es passa a l'intèrpret d'ordres com a valor de retorn de grep
. Un resultat de zero significa la cadena era trobat, i el resultat d’un ho significa no ho era trobat. Podem comprovar el codi de devolució mitjançant $?
paràmetres especials:
grep -q mitjana geek-1.log
ressò de $?
grep -q howtogeek geek-1.log
ressò de $?
Cerques recursives amb grep
Per fer cerques a través de directoris i subdirectoris imbricats, utilitzeu l'opció -r (recursiva). Tingueu en compte que no proporcioneu cap nom de fitxer a la línia d’ordres, heu de proporcionar un camí d'accés. Aquí cerquem al directori actual "." i qualsevol subdirectori:
grep -r -i memfree.
La sortida inclou el directori i el nom de fitxer de cada línia coincident.
Podem fergrep
seguiu enllaços simbòlics mitjançant el fitxer -R
opció (desreferència recursiva). En aquest directori tenim un enllaç simbòlic anomenat carpeta de registres
. Assenyala / home / dave / logs
.
ls -l carpeta de registres
Repetim la nostra última cerca amb el-R
opció (desreferència recursiva):
grep -R -i memfree.
Se segueix l'enllaç simbòlic i es busca el directori al qual apunta grep
també.
Cercant paraules senceres
Per defecte, grep
coincidirà amb una línia si l'objectiu de cerca apareix en qualsevol lloc d'aquesta línia, inclòs dins d'una altra cadena. Mireu aquest exemple. Anem a buscar la paraula "lliure".
grep -i free geek-1.log
Els resultats són línies que contenen la cadena "lliure", però no són paraules separades. Formen part de la cadena "MemFree".
Forçar grep
per fer coincidir només "paraules" separades, utilitzeu el fitxer -w
(paraula regexp) opció.
grep -w -i free geek-1.log
ressò de $?
Aquesta vegada no hi ha resultats perquè el terme de cerca "lliure" no apareix al fitxer com a paraula independent.
Utilització de diversos termes de cerca
El -E
L'opció (regexp estesa) us permet cercar diverses paraules. (El -E
l'opció substitueix la obsoleta egrep
versió de grep
.)
Aquesta ordre cerca dos termes de cerca, "mitjana" i "memfree".
grep -E -w -i "mitjana | memfree" geek-1.log
Es mostren totes les línies coincidents per a cadascun dels termes de cerca.
També podeu cercar diversos termes que no siguin necessàriament paraules senceres, però també poden ser paraules senceres.
El -e
L'opció (patrons) us permet utilitzar diversos termes de cerca a la línia d'ordres. Utilitzem la funció de claudàtors d’expressions regulars per crear un patró de cerca. Diu grep
per fer coincidir qualsevol dels caràcters inclosos entre els claudàtors "[]". Això vol dir grep
coincidirà amb "kB" o amb "KB" mentre cerca.
Les dues cadenes coincideixen i, de fet, algunes línies contenen les dues cadenes.
Coincidir exactament amb les línies
El-x
(regexp de línia) només coincidirà amb les línies on tota la línia coincideix amb el terme de cerca. Cerquem una marca de data i hora que sabem que només apareix una vegada al fitxer de registre:
grep -x "20-Jan - 06 15:24:35" geek-1.log
Es troba i es mostra la línia única que coincideix.
El contrari és mostrar només les línies que no partit. Això pot ser útil quan mireu fitxers de configuració. Els comentaris són fantàstics, però de vegades és difícil localitzar la configuració real entre tots. Aquí teniu el / etc / sudoers
dossier:
Podem filtrar eficaçment les línies de comentaris d'aquesta manera:
sudo grep -v "#" / etc / sudoers
Això és molt més fàcil d’analitzar.
Només es mostra el text coincident
Pot ser que no vulgueu veure tota la línia coincident, només el text coincident. El -o
(només coincideix) opció fa exactament això.
grep -o MemFree geek-1.log
La visualització es redueix a mostrar només el text que coincideix amb el terme de cerca, en lloc de tota la línia coincident.
Comptant amb grep
grep
no només tracta de text, sinó que també pot proporcionar informació numèrica. Podem fer grep
compti per a nosaltres de diferents maneres. Si volem saber quantes vegades apareix un terme de cerca en un fitxer, podem utilitzar el fitxer -c
(recompte) opció.
grep -c mitjana geek-1.log
grep
informa que el terme de cerca apareix 240 vegades en aquest fitxer.
Vostè pot fer grep
mostreu el número de línia per a cada línia coincident mitjançant la tecla -n
(número de línia) opció.
grep -n Jan geek-1.log
El número de línia de cada línia coincident es mostra al començament de la línia.
Per reduir el nombre de resultats que es mostren, utilitzeu el fitxer -m
(recompte màxim). Limitarem la sortida a cinc línies coincidents:
grep -m5 -n Jan geek-1.log
Afegint context
Sovint és útil poder veure algunes línies addicionals (possiblement línies no coincidents) per a cada línia coincident. pot ajudar a distingir quines de les línies coincidents són les que us interessen.
Per mostrar algunes línies després de la línia coincident, utilitzeu l'opció -A (després del context). En aquest exemple, demanem tres línies:
grep -A 3 -x "20-Jan-06 15:24:35" geek-1.log
Per veure algunes línies anteriors a la línia coincident, utilitzeu el fitxer -B
(context abans) opció.
grep -B 3 -x "20-Jan-06 15:24:35" geek-1.log
I per incloure línies anteriors i posteriors a la línia coincident, utilitzeu el fitxer -C
(context) opció.
grep -C 3 -x "20-Jan-06 15:24:35" geek-1.log
Es mostren els fitxers coincidents
Per veure els noms dels fitxers que contenen el terme de cerca, utilitzeu el fitxer -l
(fitxers amb coincidència) opció. Per esbrinar quins fitxers de codi font C contenen referències al fitxer sl.h
fitxer de capçalera, utilitzeu aquesta ordre:
grep -l "sl.h" * .c
Es mostren els noms dels fitxers, no les línies coincidents.
I, per descomptat, podem cercar fitxers que no continguin el terme de cerca. El -L
L'opció (fitxers sense coincidència) ho fa exactament.
grep -L "sl.h" * .c
Inici i final de línies
Podem forçar grep
per mostrar només coincidències al principi o al final d'una línia. L'operador d'expressió regular "^" coincideix amb l'inici d'una línia. Pràcticament totes les línies del fitxer de registre contenen espais, però anem a buscar línies que tinguin un espai com a primer caràcter:
grep "^" geek-1.log
Es mostren les línies que tenen un espai com a primer caràcter (al principi de la línia).
Per coincidir amb el final de la línia, utilitzeu l'operador d'expressió regular "$". Anem a buscar línies que acabin amb "00".
grep "00 $" geek-1.log
A la pantalla es mostren les línies que tenen com a caràcter final "00".
Utilitzant Pipes amb grep
Per descomptat, podeu canalitzar l'entrada grep
, conduïu la sortida des de grep
en un altre programa, i tenir grep
enclavat al mig d’una cadena de canonades.
Suposem que volem veure totes les aparicions de la cadena "ExtractParameters" als nostres fitxers de codi font C. Sabem que n’hi haurà força, de manera que introduïm la sortida a dins menys
:
grep "ExtractParameters" * .c | menys
La sortida es presenta a menys
.
Això us permet navegar pel llistat de fitxers i utilitzar-lo menys
instal·lació de cerca.
Si canalitzem la sortida des de grep
dins wc
i utilitzeu el fitxer -l
(línies), podem comptar el nombre de línies dels fitxers de codi font que contenen "ExtractParameters". (Podríem aconseguir-ho utilitzant el fitxer grep
-c
(count), però aquesta és una manera ordenada de demostrar que es produeix la canonada grep
.)
grep "ExtractParameters" * .c | wc -l
Amb l’ordre següent, estem canviant la sortida des de ls
dins grep
i canalitzant la sortida des de grep
dins ordenar
. Llistem els fitxers al directori actual, seleccionem els que contenen la cadena "Aug" i els ordenem per mida de fitxer:
ls -l | grep "Aug" | ordena + 4n
Desglossem això:
- ls -l: Realitzeu una llista de formats llargs dels fitxers mitjançant
ls
. - grep "Aug": Seleccioneu les línies de
ls
llistats que contenen "Aug". Tingueu en compte que també trobareu fitxers que tinguin el nom "Aug". - ordena + 4n: Ordeneu la sortida de grep a la quarta columna (mida del fitxer).
Obtenim un llistat ordenat de tots els fitxers modificats a l'agost (independentment de l'any), per ordre ascendent de mida de fitxer.
RELACIONATS:Com s'utilitza Pipes a Linux
grep: Menys una ordre, més aliat
grep
és una eina fantàstica a la vostra disposició. Data del 1974 i continua en marxa perquè necessitem el que fa i res no ho fa millor.
Acoblament grep
amb algunes expressions regulars-fu realment el porta al següent nivell.
RELACIONATS:Com s'utilitzen expressions regulars bàsiques per cercar millor i estalviar temps