Linux/Mac Terminal Tutorial: The Grep Command - Search Files and Directories for Patterns of Text
Innehållsförteckning:
- Grep Command Syntax
- Hur man använder
grepatt söka efter en sträng i filer - Invertera match (uteslut)
- Hur man använder Grep för att söka efter en sträng i kommandoutput
- Rekursiv sökning
- Visa bara filnamnet
- Skydd mot okänslig sökning
- Sök efter fullständiga ord
- Visa radnummer
- Räkna matcher
- Sök efter flera strängar (mönster)
- Tyst läge
- Grundläggande regelbundet uttryck
- Utökade regelbundna uttryck
- Skriv ut linjer före en match
- Skriv ut linjer efter en match
- Slutsats
grep
kommandot som står för “global reguljära uttryckstryck” är ett av de kraftfullaste och mest använda kommandona i Linux.
Grep söker i en eller flera inmatningsfiler efter rader som matchar ett givet mönster och skriver varje matchande rad till standardutdata. Om inga filer anges läser
grep
från standardingången, som vanligtvis är utgången från ett annat kommando.
I den här tutorialen visar vi dig hur du använder
grep
kommandot genom praktiska exempel och detaljerade förklaringar av de vanligaste GNU
grep
alternativen.
Grep Command Syntax
Innan vi går in på hur du använder
grep
kommandot, låt oss börja med att granska grundsyntaxen.
Uttryck av
grep
verktyg har följande form:
grep PATTERN
Objekten i fyrkantiga parenteser är valfria.
-
OPTIONS- Noll eller fler alternativ. Grep tillhandahåller ett antal alternativ som styr dess beteende.PATTERN-PATTERN.FILE- Noll eller fler inmatningsfilnamn.
För att kunna söka i filen måste användaren som kör kommandot ha läsåtkomst till filen.
Hur man använder
grep
att söka efter en sträng i filer
Den mest grundläggande användningen av
grep
kommandot är att söka efter en sträng (text) i en fil.
För att exempelvis visa raderna från
/etc/passwd
innehåller strängbash kan du använda följande kommando:
grep bash /etc/passwd
Utgången ska se ut så här:
root:x:0:0:root:/root:/bin/bash linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash
Om strängen innehåller mellanslag måste du bifoga den i enstaka eller dubbla citattecken:
grep "Gnome Display Manager" /etc/passwd
Invertera match (uteslut)
Om du vill visa rader som inte matchar ett mönster använder du alternativet
--invert-match
(eller -
--invert-match
).
Till exempel för att visa raderna från
/etc/passwd
som inte innehåller strängen
nologin
du använda följande kommando:
grep -v nologin /etc/passwd
root:x:0:0:root:/root:/bin/bash colord:x:124:124::/var/lib/colord:/bin/false git:x:994:994:git daemon user:/:/usr/bin/git-shell linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash
Hur man använder Grep för att söka efter en sträng i kommandoutput
I stället för att ange inmatningsfiler kan du leda utdata från ett annat kommando till
grep
och sedan bara visa rader som matchar ett givet mönster.
För att ta reda på vilka processer som körs på ditt system som
www-data
du använda följande
ps
kommando:
ps -ef | grep www-data
www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process
Du kan också kedja flera rör på kommandot. Som du ser i utgången ovan finns det också en rad som innehåller
grep
processen. Om du inte vill att den raden ska visas skicka utdata till en annan
grep
instans som visas nedan.
ps -ef | grep www-data | grep -v grep
www-data 18247 12675 4 16:00 ? 00:00:00 php-fpm: pool www root 18272 17714 0 16:00 pts/0 00:00:00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn www-data www-data 31147 12770 0 Oct22 ? 00:05:51 nginx: worker process www-data 31148 12770 0 Oct22 ? 00:00:00 nginx: cache manager process
Rekursiv sökning
För att rekursivt söka efter ett mönster använder du, använd alternativet
-r
(eller -
--recursive
). Detta kommer att söka igenom alla filer i den angivna katalogen och hoppa över symlänkar som stöds rekursivt. För att följa alla symboliska länkar använder du
-R
alternativet (eller -
--dereference-recursive
).
I följande exempel söker vi efter strängen
linuxize.com
i alla filer i katalogen
/etc
:
grep -r linuxize.com /etc
Kommandot kommer att skriva ut de matchande raderna som är förinställda av hela sökvägen till filen.
/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com;
Om istället
-r
använder du
-R
alternativet följer
grep
alla symboliska länkar:
grep -R linuxize.com /etc
Lägg märke till den sista raden i utgången. Den raden skrivs inte ut i exemplet ovan eftersom filer i Nginxs
sites-enabled
katalog är symlänkar till konfigurationsfiler i den plats
sites-available
katalogen.
/etc/hosts:127.0.0.1 node2.linuxize.com /etc/nginx/sites-available/linuxize.com: server_name linuxize.com www.linuxize.com; /etc/nginx/sites-enabled/linuxize.com: server_name linuxize.com www.linuxize.com;
Visa bara filnamnet
För att undertrycka standardutgången för
grep
och bara skriva ut namnen på filer som innehåller det matchade mönstret kan du använda alternativet
-l
(eller -
--files-with-matches
).
Till exempel för att söka igenom alla filer som slutar med
.conf
i den aktuella arbetskatalogen och bara skriva ut namnen på filer som innehåller strängen
linuxize.com
typ:
grep -l linuxize.com *.conf
Utgången ser ut så här:
tmux.conf haproxy.conf
Alternativet
-l
används vanligtvis i kombination med det rekursiva alternativet
-R
:
Skydd mot okänslig sökning
Som standard är
grep
kommandot skiftlägeskänslig. Detta betyder att versaler och gemener behandlas som distinkta.
För att ignorera fall när du söker använder du alternativet
-i
(eller
--ignore-case
).
Till exempel när du söker efter
Zebra
utan något alternativ kommer följande kommando inte att visa någon utgång, dvs. det finns matchande rader:
grep Zebra /usr/share/words
Men om du utför en okänslig sökning med hjälp av alternativet
-i
kommer det att matcha både versaler och gemener:
grep -i Zebra /usr/share/words
Att ange “Zebra” kommer att matcha “zebra”, “ZEbrA” eller någon annan kombination av stora och små bokstäver för den strängen.
Sök efter fullständiga ord
När du söker efter "gnu" kommer
grep
också att skriva ut raderna där "gnu" är inbäddat i större ord, till exempel "cygnus" eller "magnum".
grep gnu /usr/share/words
cygnus gnu interregnum lgnu9d lignum magnum magnuson sphagnum wingnut
För att bara returnera de rader där den angivna strängen är ett helt ord (omslutet av tecken som inte är ord) använder du alternativet
--word-regexp
(eller
--word-regexp
).
az
,
AZ
och
0-9
) och understreck (
_
). Alla andra tecken betraktas som icke-ordtecken.
grep -w gnu /usr/share/words
Visa radnummer
För att visa antalet rader som innehåller en sträng som matchar ett mönster använder du alternativet
-n
(eller -
--line-number
). När du använder det här alternativet kommer
grep
att skriva ut matchningarna till standardutmatningen förinställd med radnumret som den hittades på.
Till exempel för att visa raderna från
/etc/services
innehåller strängbash
bash
med det matchande radnumret kan du använda följande kommando:
grep -n 10000 /etc/services
Utgången nedan visar oss att matchningarna finns på linjerna 10423 och 10424.
10423:ndmp 10000/tcp 10424:ndmp 10000/udp
Räkna matcher
Om du vill skriva ut ett antal matchande rader till standardutmatningen använder
--count
alternativet
-c
(eller -
--count
).
I exemplet nedan räknar vi antalet konton som har
/usr/bin/zsh
som ett skal.
grep -c '/usr/bin/zsh' /etc/passwd
Sök efter flera strängar (mönster)
Två eller flera sökmönster kan förenas med OR-operatören
|
.
Som standard tolkar
grep
mönstret som ett grundläggande regelbundet uttryck där metatecken som
|
förlorar sin speciella betydelse, och deras backslash versioner måste användas.
I exemplet nedan söker vi efter alla förekomster av orden
fatal
,
error
och
critical
i Nginx-loggfilsfilen:
grep 'fatal\|error\|critical' /var/log/nginx/error.log
grep -E 'fatal|error|critical' /var/log/nginx/error.log
Tyst läge
-q
(eller -
--quiet
) berättar för
grep
att inte skriva något till terminalen (standardutgång). Om en matchning hittas kommer kommandot att avsluta med status
0
. Detta är användbart när du använder
grep
i skalskript där du vill kontrollera om en fil innehåller en sträng och utföra en viss åtgärd beroende på resultatet.
Här är ett exempel på att använda
grep
i ett tyst läge som ett testkommando i ett
if
uttalande:
if grep -q PATTERN filename then echo pattern found else echo pattern not found fi
Grundläggande regelbundet uttryck
GNU Grep har två regelbundna uttrycksfunktionsuppsättningar, Basic och Extended. Som standard tolkar
grep
mönstret som ett grundläggande reguljärt uttryck.
När de används i grundläggande reguljärt uttrycksläge är alla andra tecken utom metatecken faktiskt vanliga uttryck som matchar sig själva. Nedan finns en lista över de mest använda metatecken:
-
Använd symbolen
^(caret) för att matcha uttrycket i början av en rad. I följande exempel kommer strängen^kangarooatt matcha endast om den inträffar i början av en rad.grep "^kangaroo" file.txtAnvänd symbolen
$(dollar) för att matcha uttrycket i slutet av en rad. I följande exempel matchar strängenkangaroo$endast om den inträffar i slutet av en rad.grep "kangaroo$" file.txtAnvänd
.(period) symbol för att matcha varje enskilt tecken. Till exempel, för att matcha allt som börjar medkandå har två tecken och slutar med strängenroo, kan du använda följande mönster:grep "kan..roo" file.txtAnvända sig av
(parentes) för att matcha varje enskilt tecken som ligger i parenteserna. Hitta till exempel raderna som innehålleraccepteller "accentDu kan använda följande mönster:grep "accet" file.txtAnvända sig av
(parentes) för att matcha varje enskilt tecken som ligger i parenteserna. Följande mönster kommer att matcha alla kombinationer av strängar som innehållerco(any_letter_except_l)a, såsomcoca,cobaltoch så vidare, men kommer inte att matcha raderna som innehållercola,grep "coa" file.txt
För att undgå den speciella betydelsen av nästa tecken, använd symbolen
\
(backslash).
Utökade regelbundna uttryck
För att tolka mönstret som ett utökat regelbundet uttryck använder du alternativet
-E
(eller -
--extended-regexp
). Utökade regelbundna uttryck inkluderar alla grundläggande metatecken, tillsammans med ytterligare metatecken för att skapa mer komplexa och kraftfulla sökmönster. Nedan följer några exempel:
-
Matcha och extrahera alla e-postadresser från en given fil:
grep -E -o "\b+@+\.{2, 6}\b" file.txtMatcha och extrahera alla giltiga IP-adresser från en given fil:
grep -E -o '(25|2|??)\.(25|2|??)\.(25|2|??)\.(25|2|??)' file.txt
Alternativet
-o
används för att bara skriva ut den matchande strängen.
Skriv ut linjer före en match
Om du vill skriva ut ett visst antal rader innan du matchar rader använder du alternativet
-B
(eller -
--before-context
).
Om du till exempel vill visa fem rader med ledande sammanhang innan du matchar rader använder du följande kommando:
Skriv ut linjer efter en match
Om du vill skriva ut ett visst antal rader efter matchande rader använder du alternativet
-A
(eller
--after-context
).
Till exempel för att visa fem rader med efterföljande sammanhang efter matchande rader, använder du följande kommando:
Slutsats
Med
grep
kommandot kan du söka efter ett mönster inuti filer. Om en matchning hittas kommer grep att skriva ut raderna som innehåller det angivna mönstret.
Det finns mycket mer att lära sig om Grep på sidan Grep Användarmanual.
grep terminalHitta svåra att hitta 800 nummer
Kan du inte hitta ett service- eller supportnummer för AOL? Microsoft? Yahoo? Den här webbplatsen har hundratals.
Ibland kan kopiering eller flyttning av filer vara mycket irriterande. Ett av de vanligaste problemen när du arbetar på datorn är att långsammare kopiering eller flyttning av filer går snabbt, speciellt vid överföring av stora filer. Om du regelbundet överför en stor mängd filer och vill öka hastigheten på att kopiera eller flytta filer,
File Fisher
Hitta och ersätt text i flera filer i bulk på Windows
Hitta och ersätt verktyg hjälper dig att hitta och ersätta text i flera filer i bulk. Skriv bara in texten och tryck på Ersätt för att ersätta text direkt.







