#Grep (och regex)

By . Latest revision .

Vi har kikat på grep tidigare och vi vet hur vi använder det för att matcha delsträngar från en fil och manipulera utskriften. Vi kan även använda oss av reguljära uttryck i vår matchning.

Några “bra att ha”-options:

Command Beskrivning
$ grep -E Vi slipper “escapea” tecken som []{} etc. Utan -E hade vi fått använda \[\]\{\}.
$ grep -o Vi visar enbart matchningen och utelämnar resten av raden.
$ grep -n Visar även vilken rad matchningen är på.
$ grep -f <file1> <file2> I file1 kan vi ha ett uttryck per rad och använda det på textmassan i file2. Till exempel: $ grep -f a.txt b.txt kommer plocka radvis från a.txt och applicera det på b.txt. Mycket effektivt.
$ grep <pattern> <file1> <file2> letar i båda filerna och matchar.

Vi kan såklart kombinera options i våra kommandon, tex $ grep -Eo -f <file1> <file2> <file3>.

#Special backslash expressions

GNU grep har ett par inbyggda “backslash expressions” som kan underlätta för oss. Framförallt är det \w (matcha ord) och \s (space) som fungerar.

#Några exempel

Vi tar några exempel på hur det kan gå till. Det bästa är att själv sitta och testa de olika konstruktionerna tidigare i artikeln för att se vad som händer. Filen som används återfinns i exempelmappen. Den innehåller en massa amerikanska presidenter.

Matcha alla som har förnamnet “William”:

$ grep -E "William" presidents.txt
William Henry Harrison, 1841-1841
William McKinley, 1897-1901
William Howard Taft, 1909-1913
William Jefferson Clinton, 1993-2001

Om ens mönster innehåller mellanslag måste man omsluta mönstret med quotes:

$ grep -E "George Walker" presidents.txt
George Walker Bush, 2001-2009

Matcha alla vars första bokstav är “W” eller “A”:

$ grep -E "^[WA]" presidents.txt
Andrew Jackson, 1829-1837
William Henry Harrison, 1841-1841
Abraham Lincoln, 1861-1865
Andrew Johnson, 1865-1869
William McKinley, 1897-1901
William Howard Taft, 1909-1913
Woodrow Wilson, 1913-1921
Warren Gamaliel Harding, 1921-1923
William Jefferson Clinton, 1993-2001

Matcha alla vars första bokstav INTE är i spannet A-V:

$ grep -E "^[^A-V]" presidents.txt
William Henry Harrison, 1841-1841
Zachary Taylor, 1849-1850
William McKinley, 1897-1901
William Howard Taft, 1909-1913
Woodrow Wilson, 1913-1921
Warren Gamaliel Harding, 1921-1923
William Jefferson Clinton, 1993-2001

Matcha alla vars rad sllutar på 93:

$ grep -E "93$" presidents.txt
Benjamin Harrison, 1889-1893
George Herbert Walker Bush, 1989-1993

Matcha alla vars tillträdesår börjar på 1 och slutar på 3:

$ grep -E " 1..3" presidents.txt
# Alternativt
# grep -E "1[0-9]{2}3-" presidents.txt
Franklin Pierce, 1853-1857
Grover Cleveland, 1893-1897
Woodrow Wilson, 1913-1921
Calvin Coolidge, 1923-1929
Franklin Delano Roosevelt, 1933-1945
Dwight David Eisenhower, 1953-1961
Lyndon Baines Johnson, 1963-1969
William Jefferson Clinton, 1993-2001

Matcha alla “James” vars andra namn börjar på “B” eller “K”:

$ grep -E "James [BK]" presidents.txt
James Knox Polk, 1845-1849
James Buchanan, 1857-1861

Matcha alla där antingen “Obama” eller “Earl” finns med:

$ grep -E "Obama|Earl" presidents.txt
James Earl Carter Jr., 1977-1981
Barack Hussein Obama, 2009-2017

Matcha alla “John” och “Johnson”. Här ser vi även hur en grupp fungerar, ? talar om att gruppen med “son” ska finnas 0 eller 1 gång.

$ grep -E "John(son)?" presidents.txt
John Adams, 1797-1801
John Quincy Adams, 1825-1829
John Tyler, 1841-1845
Andrew Johnson, 1865-1869
John Fitzgerald Kennedy, 1961-1963
Lyndon Baines Johnson, 1963-1969

Som vi sett kan vi använda “character classes” för att matcha spann av antingen bokstäver eller siffror. Grep har även stöd för några till som fungerar likadant men ser ut på ett annat sätt:

Quantifier Character Classes
[:alnum:] Alphanumeric characters.
[:alpha:] Alphabetic characters.
[:blank:] Space and tab.
[:digit:] Digits.
[:lower:] Lowercase letters.
[:upper:] Uppercase letters.

Dessa behöver vi lägga i en character class då [ är en builtin i shellet ($ man [).

$ grep "[[:digit:]]" <file>

#Avslutningsvis

Det här var lite om grunderna i regex med grep. Kör igång och testa på sidorna:

Använd sedan artikeln att luta dig mot i uppgifterna.

#Revision history

  • 2023-09-12: (A, lew) Första versionen.

Document source.

Category: regex, unix, linux, grep.