#Grep (och regex)
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.