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


$config[zx-auto] not found$config[zx-overlay] not found