Korrekt användning av Find och Grep-kommandon i Linux

De flesta nybörjare av Unix-system, särskilt Linux, känner inte till de grundläggande kommandoradsoperatörer som används i detta operativsystem. Låt oss titta närmare på funktionerna och användningen av hitta och grep operatörer.

Använda Find och Grep-kommandon i Linux.

HITTA

Linux-find-kommandot är ett kommandoradsverktyg för att kryssa filhierarkin. Det kan användas för att söka efter filer och kataloger och utföra efterföljande operationer med dem. Den stöder sökning efter fil, mapp, namn, skapningsdatum, ändringsdatum, ägare och behörigheter. Med -exec kan andra UNIX-kommandon utföras för hittade filer eller mappar. syntax:

$ hitta [var du ska starta sökningen] [uttryck bestämmer vad du ska hitta] [-alternativ] [vad man ska hitta]

alternativ:

  • -exec - den obligatoriska filen som uppfyller ovanstående kriterier och returnerar 0 som ett utgångsläge för framgångsrikt kommandotillförsel;
  • -ok - fungerar på samma sätt som -exec, förutom att användaren först uppmanas
  • -inum N - sök med numret "N";
  • -länkar N - sök med länkar "N";
  • -namn demo - sök efter filer som anges i "demo";
  • -nyckelfil - sök efter filer som har ändrats / skapats efter "fil";
  • -perm oktal - sök om upplösningen är oktal;
  • -print - visa sökvägen till de dokument som hittades med de andra kriterierna
  • -empty - sök efter tomma dokument och kataloger;
  • -size + N / -N - sökblock "N"; "N" och "c" kan användas för att mäta storleken i tecken; "+ N" betyder en större storlek av "N" -block, och "-N" betyder en mindre storlek av "N" -block;
  • - Användarnamn - Sök efter dokument som tillhör användarnamnet eller identifieraren "Namn";
  • \ (expr \) - True om "expr" är sant; Används för att gruppera kriterier i samband med OR eller AND.

GREP

Grep-kommandot används för att söka efter filer. Funktionen står för "global utskrift av reguljära uttryck" och är en av de mest kraftfulla och ofta använda kommandon i Linux. Kommandot söker efter en eller flera inmatningsfiler som matchar det angivna mönstret och skriver varje motsvarande rad till standardutmatningen. Om inga filer är angivna, läser kommandot från standardinmatningen, som vanligtvis är resultatet av ett annat kommando. I den här artikeln visar vi hur du anger ett kommando med praktiska exempel och detaljerade förklaringar av de vanligaste GNU grep-alternativen.

Kommandosyntax

Innan vi börjar använda kommandot, låt oss börja med att granska den grundläggande syntaksen. Användningsuttryck har följande formulär:

[OPTIONS] PATTERN [FIL ...]

Artiklar i kvadratkonsoler är frivilliga.

  • OPTIONS - noll eller fler val. Laget ger ett antal alternativ som styr dess beteende.
  • PATTERN - Sökmönster.
  • FIL - noll eller flera inmatningsfilnamn.

Så här anger du ett kommando för att söka efter filer

Huvudsyftet med kommandot är att söka efter text i filen. Till exempel, för att visa från filen / etc / passwd som innehåller baslinjen kan du använda följande kommando:

$ grep bash / etc / passwd

Utgången ska se ut så här:

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

domain1000: 1000: domain: / home / domain: / bin / bash

Om strängen innehåller mellanslag måste du bifoga den i enkla eller dubbla citat:

$ "Gnome Display Manager" / etc / passwd

Inverter Match (ex)

För att visa linjer som inte matchar mönstret, ange parametern -v (eller -invert-match). Om du till exempel vill visa en fil som inte innehåller nologin från filen / etc / passwd, kan du ange följande kommando:

$ -v nologin / etc / passwd

Output:

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

kolord 124: 124 :: / var / lib / kolord: / bin / false

git 994: 994: Git Daemon-användare: /: / usr / bin / git-shell

linuxize 1000: 1000: linuxize: / home / linuxize: / bin / bash

Så här använder du kommandot för att söka i utmatningen

I stället om du anger inmatningsfiler kan du omdirigera utmatningen från ett annat kommando och visa bara de rader som matchar det angivna mönstret. Till exempel, för att ta reda på vilka processer som körs på ditt system som en www-data-användare, kan du använda följande kommando:

$ ps -ef | www-data som

Output:

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 -färg = auto-exclude-dir = .bzr -exclude-dir = CVS -exclude-dir = .git -exclude-dir = .hg -exclude-dir = .svn www-data

www-data 31147 12770 0 okt22? 00:05:51 nginx: arbetarprocess

www-data 31148 12770 0 okt22? 00:00:00 nginx: cache manager process

Du kan också kombinera flera kanaler till ett lag. Som du kan se i utgången ovan finns det också en rad som innehåller processen. Om du inte vill att den här raden ska visas ska du skicka utmatningen till en annan instans, som visas nedan.

$ ps -ef | www-data | grep -v grep

Output:

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 -färg = auto-exclude-dir = .bzr -exclude-dir = CVS -exclude-dir = .git -exclude-dir = .hg -exclude-dir = .svn www-data

www-data 31147 12770 0 okt22? 00:05:51 nginx: arbetarprocess

www-data 31148 12770 0 okt22? 00:00:00 nginx: cache manager process

Rekursiv sökning

För att rekursivt söka efter ett mönster anger du alternativet -r (eller -recursivt). Det här låter dig söka igenom alla filer i den angivna katalogen och hoppa över symboliska länkar som uppträder rekursivt. För att gå igenom alla symboliska länkar, använd alternativet -r (eller -referens-rekursivt). I följande exempel söker vi efter domain.com i alla filer i katalogen / etc:

$ -r domain.com / etc

Kommandot skriver ut motsvarande fält med hela filvägs prefixet.

/etc/hosts:127.0.0.1 node2.domain.com /etc/nginx/sites-available/domain.com: server_name domain.com www.domain.com;

Om istället för -r du använder alternativet -R följer kommandot alla symboliska länkar:

$ -R domain.com / etc

Observera det sista utmatningsfältet. Detta skrivs inte ut i exemplet ovan, eftersom filerna i Nginx-katalogen med webbplatser är symboliska länkar till konfigurationsfiler i den tillgängliga katalogen.

Output:

/etc/hosts:127.0.0.1 node2.domain.com

/etc/nginx/sites-available/domain.com: server_name domain.com www.domain.com;

/etc/nginx/sites-enabled/domain.com: server_name domain.com www.domain.com;

Visa endast filnamn

För att undertrycka standardutmatningen och bara skriva ut namnen på filer som innehåller det matchade mönstret, kan du ange alternativet -l (eller -filer-med-matchningar). Om du t.ex. vill söka efter alla filer som slutar i .conf i den nuvarande arbetsmappen och bara skriva ut filnamn som innehåller domain.com-typen skriver du:

$ -L domain.com * .conf

Utgången kommer att se ut så här:

tmux.conf

haproxy.conf

-L-alternativet brukar användas i samband med rekursivt -R-alternativet:

$ -Rl domain.com / tmp

Fall okänslighet

Kommandot är som standard huvudkänsligt, vilket betyder att versaler och små bokstäver behandlas som olika. För att ignorera fallet när du söker, ange alternativet -i (eller -ignore-case). Om du till exempel söker efter en Zebra utan något alternativ, kommer följande kommando inte att visa någon utmatning, dvs. det matchar.

$ Zebra / usr / dela / ord

Men om du utför en iögonfallande sökning, använd alternativet -i, det kommer att matcha både stora och små bokstäver:

$ grep -i Zebra / usr / dela / ord

Indikationen "Zebra" kommer att motsvara "Zebra", "ZEbrA" eller någon annan kombination av versaler och små bokstäver.

Output:

zebra

Zebras

zebror

Exakt matchning

När du söker, skriver gnu också gnu, där större ord sätts in, till exempel cygnus eller magnum.

$ gnu / usr / share / words

Output:

cygnus

GNU

interregnum

lgnu9d

lignum

magnum

Magnuson

sphagnum

wingnut

För att returnera endast de uttryck där det angivna fältet är ett helt ord (ej bifogat i ord) kan du använda alternativet -w (eller -word-regexp).

VIKTIGT. Tecknen i ordet innehåller alfanumeriska tecken (az, az och 0-9) och understrykningspunkter (_). Alla andra tecken behandlas som icke-verbala tecken.

Om du kör samma kommando som ovan, inklusive alternativet -w, returneras kommandot bara de som innehåller gnu som ett separat ord.

$ grep -w gnu / usr / share / words

Utgång: gnu

Visa nummer

För att visa antalet rader som innehåller ett mönster, använd parametern -n (eller -linjenummer). Med det här alternativet skrivs ut matchningar till standardutgången med prefixet för numret där det hittades. Om du exempelvis vill visa från filen / etc / services som innehåller bash-prefixet med motsvarande nummer kan du använda följande kommando:

$ grep -n 10000 / etc / tjänster

Utgången nedan visar att matcherna är vid 10423 och 10424.

Output:

10423: ndmp 10.000 / tcp

10424: ndmp 10000 / utp

räkna

För att skriva ut antalet matchande linjer till standardutmatningen, använd parametern -c (eller -count). I exemplet nedan räknar vi antalet konton som har skalet / usr / bin / zsh.

$ grep -c '/ usr / bin / zsh' / etc / passwd

Utgång: 4

Flera linjer (mönster)

Operatören OR kan kombinera två eller flera sökmönster |. Som standard tolkar kommandot mönstret som det huvudsakliga reguljära uttrycket, i vilket metatapeer förlorar sin speciella betydelse och deras versioner med backslash ska användas. I exemplet nedan söker vi efter alla händelser av orden dödlig, fel och kritisk i Nginx-felloggfilen:

$ grep 'dödlig \ | error \ | critical' /var/log/nginx/error.log

Om du använder det utökade regelbundna uttrycksalternativet -E (eller -extended-regexp), ska uttalandet inte undvikas, enligt nedan:

$ grep -E 'dödlig | error | critical' /var/log/nginx/error.log

Regelbundet uttryck

GNU Grep har två uppsättningar av reguljära expressionsfunktioner - Basic och Extended. Som standard tolkar funktionen mönstret som ett grundläggande reguljärt uttryck, för att växla till förlängda reguljära uttryck, måste du använda alternativet -E. När du använder reguljära uttryck i huvudläget är alla andra tecken, utom meta tecken, faktiskt vanliga uttryck som motsvarar varandra. Nedan följer en lista över de vanligaste metateklarna:

  • Använd ^ tecknet (karet karaktären) för att matcha uttrycket i början av en rad. I följande exempel kommer ^ känguru att matcha endast om det inträffar i början: $ grep "^ kangaroo" file.txt
  • Använd $ (dollar) symbolen för att matcha uttrycket i slutet. I följande exempel kommer känguru $ bara att matcha om det uppstår i slutet: grep "kangaroo $" file.txt
  • Använd symbolen. (punkt) för att matcha alla enskilda tecken. Till exempel, för att matcha allt som börjar med kan med två tecken och slutar med roo, kan du använda följande mönster: $ grep "kan..roo" file.txt
  • Använd [] (parentes) för att matcha alla enskilda tecken i parentes. Hitta till exempel de som innehåller accept eller "accent, du kan använda följande mönster: $ grep" acce [np] t "file.txt

För att undvika den speciella betydelsen av nästa tecken, använd tecknet \ (backslash).

Utökade reguljära uttryck

För att tolka ett mönster som ett utökat regelbundet uttryck, använd parametern -E (eller -extended-regexp). Utökade reguljära uttryck inkluderar alla grundläggande metakarakterer, samt ytterligare metateklar 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 den här filen: $ grep -E -o "\ b [A-Za-z0-9 ._% + -] [A-Za-z0-9 .-] + \. [A-Za-z] {2.6} \ b "file.txt
  • Karta och extrahera alla giltiga IP-adresser från den här filen: $ grep -E -o '(25 [0-5] | 2 [0-4] [0-9] | [01]? [0-9] [0 -9] a) (25 [0-5] | 2 [0-4] [0-9] | [01]? [0-9] [0-9] 5] | 2 [0-4] [0-9] | [01]? [0-9] [0-9]?). (25 [0-5] | 2 [0-4] [0- 9] | [01]? [0-9] [0-9]?) 'File.txt

Alternativet -O används för att endast skriva ut matchningar.

Skriv ut innan du räknar

Om du vill skriva ut ett visst antal rader innan du matchar, använd parametern -B (eller -för-kontext). Om du till exempel vill visa 5 rader av inledande sammanhang innan du matchar kan du använda följande kommando: $ grep -A 5 root / etc / passwd

Skriv ut efter sökning

Om du vill skriva ut ett visst antal rader efter en match använder du parametern -A (eller -kontext). Om du till exempel visar 5 rader i det slutliga sammanhanget efter matchande strängar kan du använda följande kommando: $ grep -B 5 root / etc / passwd

Detta är allt som behövs för fullständig användning av kommandoninformation. Om du redan använder Linux och kan ge några råd till nybörjare, dela kommentarer enligt denna artikel.