Reguljära uttryck I denna del i artikelserien tänkte jag demonstrera hur vi kan arbeta mer effektivt i Linux med reguljära uttryck och verktyget egrep. Denna del bygger alltså direkt vidare på föregående del.

Lista en viss typ filer

Som vi lärde oss i föregående del kan vi använda jokertecken när vi listar filer med ls. Men enbart med jokertecken kan vi inte göra några mer avancerade saker, vi behöver då istället reguljära uttryck och egrep.

Om vi vill lista alla filer i en katalog, exempelvis /etc, som enbart är vanliga filer – inga kataloger, symboliska länkar eller dylikt – och som slutar på antingen .conf eller .config kan vi skriva följande kommando:

ls -l | egrep '^-.*\.conf(ig){0,1}$'

Ett utdrag av resultatet från en sådan listning på mitt egna system visas nedan:

-rw-r--r--  1 root root       34 mar 21  2016 ld.so.conf
-rw-r--r--  1 root root       26 aug 30  2014 libao.conf
-rw-r--r--  1 root root      191 dec 26  2015 libaudit.conf
-rw-r--r--  1 root root      599 feb 19  2009 logrotate.conf
-rw-r--r--  1 root root     5174 dec 13  2016 manpath.config
-rw-r--r--  1 root root      973 mar 18  2016 mke2fs.conf
-rw-r--r--  1 root root     2064 nov 23  2006 netscsid.conf
-rw-r--r--  1 root root      540 jan 30  2017 nsswitch.conf

Om vi tittar på resultatet ovan ser vi att listning visar både .conf och .config-filer, exempelvis logrotate.conf och manpath.config. Vad är det då som händer?

  1. Först använder jag ls -l för att få en så kallad long listing, där filtyp, rättigheter och användare listas. Filtypen är det allra första tecknet till vänster. En vanlig fil betecknas med ett bindestreck (-).

  2. Därefter omdirigerar jag utdatan till egrep med det reguljära uttryck ^-.*\.conf(ig){0,1}$. Bit för bit betyder det reguljära uttrycket: 1. Att det allra första tecknet på raden måste vara ett bindestreck. Detta betecknas med ^-. 2. Därefter kan ett valfritt antal valfria tecken tecken förekomma vilket betecknas med .*. Kom ihåg att . är vilket tecken som helst, men bara ett enda. * betyder att det föregående tecknet får förekomma ett valfritt antal gånger. 3. \.conf(ig){0,1}$ betyder att därefter måste texten .conf följa. Däremot kan denna text följas av ig, 0 eller 1 gång, vilket betecknas med {0,1}. Slutligen måste raden ta slut. Ingenting får alltså stå efter .conf eller .config på raden.

Om vi istället skulle vilja söka efter kataloger som slutar på antingen .conf eller .conf.d kan vi enkelt modifiera det reguljära uttrycket så att kommandot nu istället ser ut så här:

ls -l | egrep '^d.*\.conf(\.d){0,1}$'

Här har jag ändrat filtypen till d, vilket är kataloger (directory). Sedan har jag ändrat (ig) mot (\.d). Eftersom punkten har speciell betydelse i reguljära uttryck – ett valfritt tecken – måste vi escapa tecknet med ett backslash (\).

Resultat av ovanstående kommando i katalogen /etc på min dator visar följande resultat:

drwxr-xr-x  2 root root     4096 sep 25 23:37 discover.conf.d
drwxr-xr-x  2 root root     4096 jun  7  2018 insserv.conf.d
drwxr-xr-x  2 root root     4096 jan  3 17:45 ld.so.conf.d
drwxr-xr-x  2 root root     4096 mar  8 06:02 testdir.conf

Lista lokala IP-adresser

Ett annat intressant exempel kan vara att lista alla lokala IPv4-adresser som finns i spannet 192.168.nnn.nnn på datorn. Det kan vi enkelt åstadkomma med följande kommando och reguljära uttryck:

ip addr | egrep '192\.168\.[0-9]{1,3}\.[0-9]{1,3}'

Det regulära uttrycket börjar med att tala om att texten måste börja med 192.168.. Därefter ska det följas av ett tal. Talet får ha 1–3 siffror mellan 0–9 ([0-9]{1,3}). Därefter ska en punkt följa, och uttrycket [0-9]{1,3} upprepas en sista gång.

På min dator visar kommandot följande utdata:

inet 192.168.0.34/24 brd 192.168.0.255 scope global enp0s31f6

Avslutning

Med reguljära uttryck kan vi göra avancerade saker, men det kan ta ett tag att lära sig. Jag rekommenderar dig därför att testa och experimentera på egen hand, det är så man lär sig bäst.

Det finns dessutom en rad andra verktyg i Linux där vi kan använda reguljära uttryck. Det är något vi ska titta på i nästa del av denna artikelserie.