Hur använder man dem effektivt?

Om du har använt Linux ett tag känner du redan till grep — Global Regular Expression Print, ett textbearbetningsverktyg som du kan använda för att söka efter filer och kataloger. Det är mycket användbart i händerna på en Linux-användare. Men att använda den utan regex kan begränsa dess möjligheter.

Men vad är Regex?

Regex är reguljära uttryck som du kan använda för att förbättra greps sökfunktioner. Regex, per definition, är ett avancerat utgångsfiltreringsmönster. Med övning kan du använda regex effektivt, eftersom du kan använda det med andra Linux-kommandon också.

I vår handledning kommer vi att lära oss hur man använder Grep och Regex effektivt.

Nödvändig förutsättning

Att använda grep med regex kräver goda Linux-kunskaper. Om du är nybörjare, kolla in våra Linux-guider.

Du behöver också tillgång till en bärbar dator eller dator som kör operativsystemet Linux. Du kan använda valfri Linux-distro efter eget val. Och om du har en Windows-maskin kan du fortfarande använda Linux med WSL2. Kolla in vår detaljerade syn på det här.

Tillgång till kommandoraden/terminalen låter dig köra alla kommandon som finns i vår grep/regex-handledning.

Dessutom behöver du också tillgång till en textfil(er) som du behöver för att köra exemplen. Jag använde ChatGPT för att skapa en textvägg och sa åt den att skriva om teknik. Uppmaningen som jag använde är enligt nedan.

”Generera 400 ord om teknik. Det bör innehålla det mesta av teknik. Se också till att du upprepar tekniknamn i texten.”

När den genererade texten, kopierade jag in den och sparade den i tech.txt-filen, som vi kommer att använda genom hela handledningen.

Slutligen är en grundläggande förståelse av kommandot grep ett måste. Du kan kolla in 16 exempel på grep-kommandon för att fräscha upp dina kunskaper. Vi kommer också att introducera grep-kommandot kort för att komma igång.

Syntax och exempel på grep-kommando

Syntaxen för grep-kommandot är enkel.

$ grep -options [regex/pattern] [files]

Som du märker förväntar den sig ett mönster och listan över filer du vill köra kommandot.

Det finns gott om grep-alternativ tillgängliga som ändrar dess funktionalitet. Dessa inkluderar:

  • – i: ignorera fall
  • -r: gör rekursiv sökning
  • -w: utför en sökning för att bara hitta hela ord
  • -v: visa alla icke-matchande rader
  • -n: visa alla matchande radnummer
  • -l: skriv ut filnamnen
  • –färg: färgat resultat
  • -c: visar antalet matchningar för mönstret som används

#1. Sök efter ett helt ord

Du måste använda argumentet -w med grep för en helordssökning. Genom att använda den kringgår du alla strängar som matchar det givna mönstret.

$ grep -w ‘tech\|5G’ tech.txt

Som du kan se resulterar kommandot i en utdata där det söker efter två ord, ”5G” och ”tech”, genom hela texten. Det markerar dem sedan med röd färg.

Här, | pipesymbolen escapes så att grep inte bearbetar den som en metatecken.

För att göra en skiftlägesokänslig sökning, använd grep med argumentet -i.

$ grep -i ‘tech’ tech.txt

Kommandot söker efter alla skiftlägesokänsliga förekomster av ”tech”-strängen, oavsett om det är ett helt ord eller en del av det.

För att visa alla rader som inte innehåller ett givet mönster, måste du använda argumentet -v.

$ grep -v ‘tech’ tech.txt

Utdata visar alla rader som inte innehåller ordet ”tech.” Du kommer också att se tomma rader. Dessa rader är raderna som ligger efter ett stycke.

För att göra en rekursiv sökning, använd argumentet -r med grep.

$ grep -R ‘error\|warning’ /var/log/*.log
#output

/var/log/bootstrap.log:2023-01-03 21:40:18 URL:http://ftpmaster.internal/ubuntu/pool/main/libg/libgpg-error/libgpg-erro 0_1.43-3_amd64.deb [69684/69684] -> "/build/chroot//var/cache/apt/archives/partial/libgpg-error0_1.43-3_amd64.deb" [1]

/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 5 package 'dpkg':

/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 5 package 'dpkg':

/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 24 package 'dpkg':

/var/log/bootstrap.log:dpkg: warning: parsing file '/var/lib/dpkg/status' near line 24 package 'dpkg':

/var/log/bootstrap.log:dpkg: warning: ignoring pre-dependency problem!

Kommandot grep söker rekursivt efter två ord, ”fel” och ”varning”, i katalogen /var/log. Detta är ett praktiskt kommando för att lära dig om eventuella varningar och fel i loggfilerna.

Grep och Regex: Vad det är och exempel

När vi arbetar med regex måste du veta att regex erbjuder tre syntaxalternativ. Dessa inkluderar:

  • Basic Regular Expressions (BRE)
  • Extended Regular Expressions (ERE)
  • Pearl-kompatibla reguljära uttryck (PCRE)

Kommandot grep använder BRE som standardalternativ. Så om du vill använda andra regex-lägen måste du nämna dem. Kommandot grep behandlar också metatecken som de är. Så om du använder metatecken som ?, +, ), måste du undkomma dem med kommandot omvänt snedstreck (\).

Syntaxen för grep med regex är enligt nedan.

$ grep [regex] [filenames]

Låt oss se grep och regex i aktion med exemplen nedan.

#1. Bokstavliga ordmatchningar

För att göra en bokstavlig ordmatchning måste du ange en sträng som regex. Ett ord är trots allt också ett regex.

$ grep "technologies" tech.txt

På samma sätt kan du också använda bokstavliga matchningar för att hitta nuvarande användare. För att göra det, spring,

$ grep bash /etc/passwd
#output

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

nitt:x:1000:1000:,,,:/home/nitt:/bin/bash

Detta visar användarna som kan komma åt bash.

#2. Ankarmatchning

Ankarmatchning är en användbar teknik för avancerade sökningar med specialtecken. I regex finns det olika ankartecken som du kan använda för att representera specifika positioner i en text. Dessa inkluderar:

  • ’^’ cart-symbol: Cart-symbolen matchar början av inmatningssträngen eller raden och letar efter en tom sträng.
  • ’$’ dollarsymbol: Dollarsymbolen matchar slutet av inmatningssträngen eller raden och letar efter en tom sträng.

De andra två ankarmatchande tecknen inkluderar ’\ b’-ordgränsen och ’\B’ icke-ordgräns.

  • ’\ b’ ordgräns: Med \b kan du hävda positionen mellan ett ord och ett icke-ordstecken. Med enkla ord låter den dig matcha hela ord. På så sätt kan du undvika partiella matchningar. Du kan också använda den för att ersätta ord eller räkna ordförekomster i en sträng.
  • \B icke-ordsgräns: Det är motsatsen till \b ordgräns i regex eftersom det hävdar en position som inte är mellan tvåords- eller icke-ordstecken.

Låt oss gå igenom exempel för att få en tydlig uppfattning.

$ grep ‘^From’ tech.txt

Att använda caret kräver att ordet eller mönstret skrivs in i rätt skiftläge. Det beror på att det är skiftlägeskänsligt. Så om du kör följande kommando kommer det inte att returnera något.

$ grep ‘^from’ tech.txt

På samma sätt kan du använda symbolen $ för att hitta meningen som matchar ett givet mönster, sträng eller ord.

$ grep ‘technology.$' tech.txt

Du kan också kombinera symbolerna ^ och $. Låt oss titta på exemplet nedan.

$ grep “^From \| technology.$” tech.txt

Som du kan se innehåller utdata meningar som börjar med ”Från” och meningar som slutar med ”teknik”.

#3. Gruppering

Om du vill söka efter flera mönster samtidigt, måste du använda gruppering. Det hjälper dig att skapa små grupper av karaktärer och mönster som du kan behandla som en enda enhet. Du kan till exempel skapa en grupp (tech) som innehåller termen ’t’, ’e’,’ c’,’ h.’

För att få en tydlig uppfattning, låt oss kolla in ett exempel.

$ grep 'technol\(ogy\)\?' tech.txt

Med gruppering kan du matcha upprepade mönster, fånga grupper och söka efter alternativ.

Alternativ sökning med gruppering

Låt oss se ett exempel på en alternativ sökning.

$ grep "\(tech\|technology\)" tech.txt

Om du vill göra en sökning på en sträng, måste du skicka den med rörsymbolen. Låt oss se det i exemplet nedan.

$ echo “tech technological technologies technical” |  grep "\(tech\|technology\)"
#output

“tech technological technologies technical”

Fånga grupper, icke-fångande grupper och upprepade mönster

Och hur är det med fånga och icke-fångande grupper?

Du måste skapa en grupp i regexet och skicka den till strängen eller en fil för att fånga grupper.

$ echo 'tech655 tech655nical technologies655 tech655-oriented 655' | grep "\(tech\)\(655\)"
#output

tech655 tech655nical technologies655 tech655-oriented 655

Och för icke-fångande grupper måste du använda ?: inom parentes.

Slutligen har vi upprepade mönster. Du måste ändra regexet för att kontrollera om det finns upprepade mönster.

$ echo ‘teach tech ttrial tttechno attest’ | grep '\(t\+\)'
#output

‘teach tech ttrial tttechno attest’

Här letar regexet efter en eller flera instanser av ”t”-tecknet.

#4. Karaktärsklasser

Med teckenklasser kan du enkelt skriva regex-uttryck. Dessa teckenklasser använder hakparenteser. Några av de välkända karaktärsklasserna inkluderar:

  • [:digit:] – 0 till 9 siffror
  • [:alpha:] – alfabetiska tecken
  • [:alnum:] – alfanumeriska tecken
  • [:lower:] – gemener
  • [:upper:] – versala bokstäver
  • [:xdigit:] – hexadecimala siffror, inklusive 0-9, AF, af
  • [:blank:] – tomma tecken som tabb eller mellanslag

Och så vidare!

Låt oss se några av dem i aktion.

$ grep [[:digit]] tech.txt

$ grep [[:alpha:]] tech.txt

$ grep [[:xdigit:]] tech.txt

#5. Kvantifierare

Kvantifierare är metatecken och är kärnan i regex. Dessa låter dig matcha exakt utseende. Låt oss titta på dem nedan.

  • * → Noll eller fler matchningar
  • + → en eller flera matchningar
  • ? → Noll eller en matchning
  • {x} → x matchar
  • {x, } → x eller fler matchningar
  • {x,z} → från x till z matchar
  • {, z} → upp till z matchningar
$ echo ‘teach tech ttrial tttechno attest’ | grep -E 't+'
#output

‘teach tech ttrial tttechno attest’

Här söker den efter ”t”-teckeninstanserna för en eller flera matchningar. Här står -E för utökat regex (som vi kommer att diskutera senare.)

#6. Utökat Regex

Om du inte gillar att lägga till escape-tecken i regexmönstret måste du använda utökat regex. Det tar bort behovet av att lägga till escape-tecken. För att göra det måste du använda flaggan -E.

$ grep -E 'in+ovation' tech.txt

#7. Använda PCRE för att göra komplexa sökningar

PCRE (Perl Compatible Regular Expression) låter dig göra mycket mer än att skriva grundläggande uttryck. Till exempel kan du skriva ”\d” som betecknar [0-9].

Du kan till exempel använda PCRE för att söka efter e-postadresser.

echo "Contact me at [email protected]" | grep -P "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b"
#output

Contact me at [email protected]

Här säkerställer PCRE att mönstret matchas. På samma sätt kan du också använda ett PCRE-mönster för att söka efter datummönster.

$ echo "The Sparkain site launched on 2023-07-29" | grep -P "\b\d{4}-\d{2}-\d{2}\b"
#output

The Sparkain site launched on 2023-07-29

Kommandot hittar datumet i formatet ÅÅÅÅ-MM-DD. Du kan ändra den för att matcha andra datumformat också.

#8. Alternering

Om du vill ha alternativa matchningar kan du använda escaped pipe-tecken (\|).

$ grep -L ‘warning\|error’ /var/log/*.log
#output

/var/log/alternatives.log

/var/log/bootstrap.log

/var/log/dpkg.log

/var/log/fontconfig.log

/var/log/ubuntu-advantage.log

/var/log/upgrade-policy-changed.log

Utdata listar filnamnen som innehåller ”varning” eller ”fel”.

Slutord

Detta leder oss till slutet av vår grep och regex-guide. Du kan använda grep med regex i stor utsträckning för att förfina sökningar. Med korrekt användning kan du spara massor av tid och hjälpa till att automatisera många uppgifter, särskilt om du använder dem för att skriva skript eller använda regex för att utföra sökningar i texten.

Kolla sedan in vanliga frågor och svar på Linux-intervjuer.