grep

Find strenge i tekstfiler ved hjælp af grep med regulært udtryk

Find strenge i tekstfiler ved hjælp af grep med regulært udtryk
grep er et af de mest populære værktøjer til at søge og finde strenge i en tekstfil. Navnet 'grep' stammer fra en kommando i det nu forældede Unix ed line editor-værktøj - ed-kommandoen til søgning globalt gennem en fil til en almindelig udtryk og så trykning disse linjer var g / re / p, hvor re var det regulære udtryk, du ville bruge. Til sidst blev kommandoen grep skrevet til at søge på en fil, når du ikke bruger ed.

I denne artikel viser vi dig at køre avanceret strengesøgning ved hjælp af Grep med regelmæssigt udtryk ved at give dig 10 praktiske eksempler på dets implementeringer. Mange eksempler, der diskuteres i denne artikel, har praktiske implikationer, hvilket betyder, at du kan bruge dem til din daglige Linux-programmering. Følgende eksempler beskriver nogle regexp-eksempler på ofte søgte mønstre.

Eks 1: Find en enkelt befragter i en tekstfil

For at udføre linjer i filen 'bog', der indeholder et '$' tegn, skal du skrive:

$ grep '\ $' bog

Eks 2: Find en enkelt streng i en tekstfil

At udføre linjer i filen 'bog', der indeholder strengen '$ 14.99 ', type:

$ grep '\ $ 14 \.99 'bog

Eks 3: Find en enkelt speciel befragter i en tekstfil

For at udføre linjer i filen 'bog', der indeholder et '\' tegn, skal du skrive:

$ grep '\\' bog

Eks 4: Matchende linjer, der begynder med bestemt tekst

Brug 'ˆ' i en regexp til at betegne begyndelsen af ​​en linje.

For at outputte alle linjer i '/ usr / dict / ord', der begynder med 'pro', skal du skrive:

$ grep 'ˆpro' / usr / dict / ord

For at outputte alle linjer i filen 'bog', der begynder med teksten 'i starten', uanset tilfældet, skriv:

$ grep -i 'ˆi begyndelsen' bog

BEMÆRK: Disse regexps blev citeret med 'tegn; dette er fordi nogle skaller ellers behandler 'ˆ' karakteren som en speciel "metakarakter"

Ud over ord- og sætningssøgninger kan du bruge grep til at søge efter komplekse tekstmønstre kaldet regulære udtryk. Et regulært udtryk - eller "regexp" - er en tekststreng med specialtegn, der angiver en sæt af mønstre, der skal matche.

Teknisk set er ord eller sætningsmønstre almindelige udtryk - bare meget enkle. I et regulært udtryk repræsenterer de fleste tegn - inklusive bogstaver og tal - sig selv. For eksempel regexp-mønsteret 1 matcher strengen '1' og mønsteret dreng matcher strengen 'dreng'.

Der er et antal reserverede tegn kaldet metategn, der ikke repræsenterer sig selv i et regulært udtryk, men de har en særlig betydning, der bruges til at opbygge komplekse mønstre. Disse metategn er som følger: ., *, [, ], ˆ, $ og \. Det er godt at bemærke, at sådanne metategn er almindelige blandt næsten alle almindelige og specielle Linux-distributioner. Her er en god artikel, der dækker specielle betydninger af metategnene og giver eksempler på deres anvendelse.

Eks 5: Matchende linjer, der slutter med bestemt tekst

Brug '$' som det sidste tegn i citeret tekst for kun at matche den tekst i slutningen af ​​en linje. For at output linjer i filen 'går', der slutter med et udråbstegn, skal du skrive:

$ grep '!$ går

Eks 6: Matchende linjer med en bestemt længde

For at matche linjer med en bestemt længde skal du bruge det antal '.'tegn mellem' ˆ 'og' $ '- for eksempel for at matche alle linjer, der er to tegn (eller kolonner) brede, skal du bruge' ˆ… $ 'som regexp til at søge efter.

For at sende alle linjer i '/ usr / dict / ord', der er nøjagtigt tre tegn brede, skal du skrive:

$ grep 'ˆ… $' / usr / dict / ord

For længere linjer er det mere nyttigt at bruge en anden konstruktion: 'ˆ.\ number \ $ ', hvor antallet er antallet af linjer, der skal matches. Brug ',' til at angive et række numre.

For at output alle linjer i '/ usr / dict / ord', der er nøjagtigt tolv tegn brede, skal du skrive:

$ grep 'ˆ.\ 12 \ $ '/ usr / dict / ord

For at sende alle linjer i '/ usr / dict / ord', der er toogtyve eller flere, skal du skrive:

$ grep 'ˆ.\ 22, \ $ '/ usr / dict / ord

Eks 7: Matchende linjer, der indeholder noget af nogle Regexps

For at matche linjer, der indeholder et hvilket som helst af et antal regexps, skal du angive hver af de regexps, der skal søges efter mellem alternationsoperatorer ('\ |') som regexp at søge efter. Linjer, der indeholder et af de givne regexps, sendes ud.

For at sende alle linjer i 'playboy', der enten indeholder mønstrene 'bogen' eller 'kage', skal du skrive:

$ grep 'bogen \ | kage' playboy

Eks 8: Matchende linjer, der indeholder alle nogle Regexps

Til outputlinjer, der matcher alle af et antal regexps, brug grep til at udføre linjer, der indeholder den første regexp, du vil matche, og rør output til en grep med den anden regexp som argument. Fortsæt med at tilføje rør til grep-søgninger efter alle de regexps, du vil søge efter.

For at outputte alle linjer i 'afspilningsliste', der indeholder både mønstre 'kysten' og 'himlen', uanset tilfældet, skriv:

$ grep -i 'the shore' playliste | grep -i himmel

Eks 9: Matchende linjer, der kun indeholder visse tegn

For at matche linjer, der kun indeholder bestemte tegn, skal du bruge regexp 'ˆ [tegn] * $', hvor tegn er dem, der matcher.  For at udføre linjer i '/ usr / dict / ord', der kun indeholder vokaler, skal du skrive:

$ grep -i 'ˆ [aeiou] * $' / usr / dict / ord

Indstillingen '-i' matcher tegn uanset tilfældet; så i dette eksempel matches alle vokalkarakterer uanset tilfældet.

Eks 10: Finde sætninger uanset afstand

En måde at søge på en sætning, der kan forekomme med ekstra mellemrum mellem ord, eller på tværs af en linje eller sideskift, er at fjerne alle linjefeedninger og ekstra mellemrum fra input og derefter grep det. For at gøre dette, rør input til tr med "\ r \ n: \> \ | -" som et argument til '-d' indstillingen (fjern alle linjeskift fra input); rør det til fmt-filteret med '-u' mulighed (udskrivning af teksten med ensartet afstand); og rør det for at gribe med det mønster, du vil søge efter.

For at søge på tværs af linjeskift efter strengen 'på samme tid som' i filen 'docs' skal du skrive:

$ kattedokumenter | tr -d '\ r \ n: \> \ |
-'| fmt -u | grep 'på samme tid som'

Resumé

I denne artikel gennemgik vi 10 praktiske eksempler på brug af Grep Linux-kommando til at søge og finde strenge i en tekstfil. Undervejs lærte vi, hvordan man bruger regelmæssige udtryk i forbindelse med Grep til at udføre komplekse søgninger på tekstfiler. Nu har du en bedre idé om, hvor stærke Linux-søgefunktioner er.

Her er yderligere ressourcer til dem, der er interesserede i at lære mere om Linux-programmering:

Ressourcer til systemadministratorer

Ressourcer til Linux Kernel Programmers

Linux File System Dictionary

Omfattende gennemgang af, hvordan Linux File and Directory System fungerer

Bedste kommandoliniespil til Linux
Kommandolinjen er ikke kun din største allierede, når du bruger Linux, den kan også være kilde til underholdning, fordi du kan bruge den til at spille...
Bedste apps til Gamepad Mapping til Linux
Hvis du kan lide at spille spil på Linux med en gamepad i stedet for et typisk tastatur- og musesystem, er der nogle nyttige apps til dig. Mange pc-sp...
Nyttige værktøjer til Linux-spillere
Hvis du kan lide at spille spil på Linux, er chancerne for, at du måske har brugt apps og hjælpeprogrammer som Wine, Lutris og OBS Studio for at forbe...