Android

Utos ng Grep sa linux (makahanap ng teksto sa mga file)

Linux команда grep - поиск фрагмента текста в файле (файлах).

Linux команда grep - поиск фрагмента текста в файле (файлах).

Talaan ng mga Nilalaman:

Anonim

Ang utos ng grep na nakatayo para sa "global regular expression print" ay isa sa pinakamalakas at karaniwang ginagamit na utos sa Linux.

Hinahanap ng Grep ang isa o higit pang mga file ng input para sa mga linya na tumutugma sa isang naibigay na pattern at isinusulat ang bawat pagtutugma ng linya sa karaniwang output. Kung walang tinukoy na mga file, binabasa ng grep mula sa karaniwang pag-input, na karaniwang ang output ng isa pang utos.

Sa tutorial na ito, ipapakita namin sa iyo kung paano gamitin ang utos ng grep pamamagitan ng mga praktikal na halimbawa, at mga detalyadong paliwanag ng mga pinaka-karaniwang pagpipilian ng GNU grep .

Grep Command Syntax

Bago magpunta sa kung paano gamitin ang utos ng grep , magsimula tayo sa pamamagitan ng pagsusuri sa pangunahing syntax.

Ang mga pagpapahayag ng grep utility ay kumukuha ng sumusunod na form:

grep PATTERN

Ang mga item sa square bracket ay opsyonal.

  • OPTIONS - Zero o higit pang mga pagpipilian. Ang Grep ay nagbibigay ng isang bilang ng mga pagpipilian na kinokontrol ang pag-uugali nito. PATTERN - pattern ng Paghahanap. FILE - Zero o higit pang mga pangalan ng file ng pag-input.

Upang maghanap sa file, ang gumagamit na nagpapatakbo ng utos ay dapat basahin ang pag-access sa file.

Paano gamitin ang grep upang Maghanap para sa isang String sa Files

Ang pinaka pangunahing paggamit ng utos ng grep ay upang maghanap para sa isang string (teksto) sa isang file.

Halimbawa, upang ipakita ang mga linya mula sa /etc/passwd file na naglalaman ng string bash maaari mong gamitin ang sumusunod na utos:

grep bash /etc/passwd

Ang output ay dapat magmukhang ganito:

root:x:0:0:root:/root:/bin/bash linuxize:x:1000:1000:linuxize:/home/linuxize:/bin/bash

Kung ang string ay may kasamang mga puwang, kailangan mong i-enclose ito sa solong o dobleng marka ng sipi:

grep "Gnome Display Manager" /etc/passwd

Invert Tugma (Ibukod)

Upang ipakita ang mga linya na hindi tumutugma sa isang pattern, gamitin ang pagpipilian na -v (o --invert-match ).

Halimbawa upang ipakita ang mga linya mula sa /etc/passwd file na hindi naglalaman ng string nologin maaari mong gamitin ang sumusunod na utos:

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

Paano gamitin ang Grep upang Maghanap para sa isang String sa Command Output

Sa halip na tukuyin ang mga file ng input, maaari mong i-pipe ang output ng isa pang utos sa grep , at pagkatapos ay ipakita lamang ang mga linya na tumutugma sa isang naibigay na pattern.

Halimbawa, upang malaman kung aling mga proseso ang tumatakbo sa iyong system bilang user www-data maaari mong gamitin ang sumusunod na utos ng ps :

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

Maaari mo ring chain ang maraming mga tubo sa utos. Tulad ng nakikita mo sa output sa itaas mayroon ding isang linya na naglalaman ng proseso ng grep . Kung hindi mo nais na ipakita ang linya na ipasa ang output sa isa pang halimbawa ng grep tulad ng ipinapakita sa ibaba.

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

Paghahanap ng Recursive

Upang maingat na maghanap para sa isang pattern gamitin ang, gamitin ang opsyon na -r (o --recursive ). Ito ay maghanap sa lahat ng mga file sa tinukoy na direktoryo, paglaktaw sa mga symlink na nakatagpo nang maingat. Upang sundin ang lahat ng mga makasagisag na link, gamitin ang opsyon na -R (o --dereference-recursive ).

Sa sumusunod na halimbawa ay hinahanap namin ang string linuxize.com sa lahat ng mga file sa loob ng /etc direktoryo:

grep -r linuxize.com /etc

Ang utos ay mag-print ng mga linya ng pagtutugma na paunang naihanda ng buong landas sa file.

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

Kung sa halip ay gumagamit ka ng -R pagpipilian grep ay susundin ang lahat ng mga makasagisag na link:

grep -R linuxize.com /etc

Pansinin ang huling linya ng output. Ang linya na iyon ay hindi nakalimbag sa halimbawa sa itaas sapagkat ang mga file sa loob ng direktoryo na sites-enabled mga sites-enabled ng Nginx ay mga symlink sa mga file ng pagsasaayos sa loob ng direktoryo na sites-available ng mga sites-available .

/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;

Ipakita lamang ang Filename

Upang sugpuin ang default na output ng grep at i-print lamang ang mga pangalan ng mga file na naglalaman ng naitugma na pattern, maaari mong gamitin ang pagpipilian na -l (o --files-with-matches ).

Halimbawa upang maghanap sa lahat ng mga file na nagtatapos sa .conf sa kasalukuyang direktoryo ng nagtatrabaho at i-print lamang ang mga pangalan ng mga file na naglalaman ng uri ng string linuxize.com :

grep -l linuxize.com *.conf

Ang output ay magiging hitsura ng isang bagay tulad nito:

tmux.conf haproxy.conf

Ang opsyon na -l ay karaniwang ginagamit kasama ng pagpipiliang muli sa recursive -R :

grep -Rl linuxize.com /tmp

Kaso Insensitive Paghahanap

Bilang default, ang utos ng grep ay sensitibo sa kaso. Nangangahulugan ito na ang mga character sa malalaking titik at malalaking titik ay itinuturing na naiiba.

Upang huwag pansinin ang kaso kapag naghahanap, gamitin ang -i pagpipilian (o --ignore-case ).

Halimbawa, kapag naghahanap para kay Zebra walang anumang pagpipilian, ang sumusunod na utos ay hindi magpapakita ng anumang output ibig sabihin, may mga pagtutugma na linya:

grep Zebra /usr/share/words

Ngunit kung nagsasagawa ka ng isang hindi mapanindik na paghahanap gamit ang pagpipilian na -i , tutugma ito sa parehong mga titik sa itaas at mas mababang kaso:

grep -i Zebra /usr/share/words

Ang pagtukoy ng "Zebra" ay tutugma sa "zebra", "ZEbrA" o anumang iba pang kumbinasyon ng mga letra sa itaas at mababang kaso para sa string na iyon.

zebra zebra's zebras

Maghanap para sa Buong Salita

Kapag naghahanap para sa "gnu", grep ay i-print din ang mga linya kung saan ang "gnu" ay naka-embed sa mas malalaking salita, tulad ng "cygnus" o "magnum".

grep gnu /usr/share/words

cygnus gnu interregnum lgnu9d lignum magnum magnuson sphagnum wingnut

Upang ibalik lamang ang mga linyang iyon kung saan ang tinukoy na string ay isang buong salita (nakapaloob sa mga character na hindi salita), gamitin ang pagpipilian na -w (o --word-regexp ).

Ang mga character character ay nagsasama ng mga alphanumeric character ( az , AZ at 0-9 ) at mga underscores ( _ ). Ang lahat ng iba pang mga character ay itinuturing bilang mga character na hindi salita.

grep -w gnu /usr/share/words

gnu

Ipakita ang Mga Numero ng Linya

Upang ipakita ang bilang ng mga linya na naglalaman ng isang string na tumutugma sa isang pattern, gamitin ang pagpipilian na -n (o - --line-number ). Kapag ginagamit ang pagpipiliang ito, i-print ng grep ang mga tugma sa karaniwang output na prefixed sa numero ng linya na nahanap ito.

Halimbawa upang ipakita ang mga linya mula sa /etc/services file ng mga /etc/services naglalaman ng string bash prefixed sa numero ng pagtutugma na linya maaari mong gamitin ang sumusunod na utos:

grep -n 10000 /etc/services

Ang output sa ibaba ay nagpapakita sa amin na ang mga tugma ay matatagpuan sa mga linya ng 10423 at 10424.

10423:ndmp 10000/tcp 10424:ndmp 10000/udp

Bilangin ang Mga Tugma

Upang mag-print ng isang bilang ng mga linya ng pagtutugma sa karaniwang output, gamitin ang pagpipilian na -c (o - --count ).

Sa halimbawa sa ibaba, binibilang namin ang bilang ng mga account na mayroong /usr/bin/zsh bilang isang shell.

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

4

Maghanap para sa Maramihang Mga Strings (Mga pattern)

Ang dalawa o higit pang mga pattern ng paghahanap ay maaaring sumali gamit ang OR operator | .

Bilang default, binibigyang kahulugan ng grep ang pattern bilang isang pangunahing regular na pagpapahayag kung saan ang mga meta-character tulad ng | mawala ang kanilang mga espesyal na kahulugan, at dapat gamitin ang kanilang mga backslashed na bersyon.

Sa halimbawa sa ibaba hinahanap namin ang lahat ng mga naganap na mga salitang fatal , error , at critical sa file ng error sa log ng Nginx:

grep 'fatal\|error\|critical' /var/log/nginx/error.log

grep -E 'fatal|error|critical' /var/log/nginx/error.log

Quiet Mode

Ang --quiet (o --quiet ) ay nagsasabi sa grep na huwag isulat ang anumang bagay sa terminal (karaniwang output). Kung natagpuan ang isang tugma, ang utos ay lalabas na may katayuan 0 . Ito ay kapaki-pakinabang kapag gumagamit ng grep sa mga script ng shell kung saan nais mong suriin kung ang isang file ay naglalaman ng isang string at magsagawa ng isang tiyak na pagkilos depende sa resulta.

Narito ang isang halimbawa ng paggamit ng grep sa isang tahimik na mode bilang isang pagsubok sa pagsubok if pahayag:

if grep -q PATTERN filename then echo pattern found else echo pattern not found fi

Pangunahing Regular na Pagpapahayag

Ang GNU Grep ay may dalawang regular na set ng tampok na expression, Basic at Pinalawak. Bilang default, binibigyang kahulugan ng grep ang pattern bilang isang pangunahing regular na pagpapahayag.

Kapag ginamit sa pangunahing regular na mode ng pagpapahayag, ang lahat ng iba pang mga character maliban sa mga meta-character, ay aktwal na mga ekspresyon na tumutugma sa kanilang sarili. Sa ibaba ay isang listahan ng mga pinaka-karaniwang ginagamit na meta-character:

  • Gumamit ng ^ (caret) na simbolo upang tumugma sa expression sa simula ng isang linya. Sa sumusunod na halimbawa, ang string ^kangaroo ay tutugma lamang kung nangyayari ito sa pinakadulo simula ng isang linya.

    grep "^kangaroo" file.txt

    Gumamit ng simbolo ng $ (dolyar) upang tumugma sa pagpapahayag sa pagtatapos ng isang linya. Sa sumusunod na halimbawa, ang string kangaroo$ ay tutugma lamang kung ito ay nangyayari sa pinakadulo ng isang linya.

    grep "kangaroo$" file.txt

    Gamitin ang . (panahon) simbolo upang tumugma sa anumang solong character. Halimbawa, upang tumugma sa anumang nagsisimula sa kan pagkatapos ay may dalawang character at nagtatapos sa string roo , maaari mong gamitin ang sumusunod na pattern:

    grep "kan..roo" file.txt

    Gumamit (bracket) upang tumugma sa anumang solong character na nakapaloob sa mga bracket. Halimbawa, hanapin ang mga linya na naglalaman ng accept o " accent , maaari mong gamitin ang sumusunod na pattern:

    grep "accet" file.txt

    Gumamit (bracket) upang tumugma sa anumang solong character na nakapaloob sa mga bracket. Ang sumusunod na pattern ay tutugma sa anumang kumbinasyon ng mga string na naglalaman ng co(any_letter_except_l)a , tulad ng coca , cobalt at iba pa, ngunit hindi tutugma sa mga linya na naglalaman ng cola , grep "coa" file.txt

Upang makatakas sa espesyal na kahulugan ng susunod na karakter, gamitin ang simbolo na (backslash).

Pinahabang Regular na Pagpapahayag

Upang bigyang-kahulugan ang pattern bilang isang pinahabang regular na pagpapahayag, gamitin ang opsyong -E (o --extended-regexp ). Ang pinalawig na mga regular na expression ay kasama ang lahat ng mga pangunahing meta-character, kasama ang mga karagdagang meta-character upang lumikha ng mas kumplikado at malakas na mga pattern ng paghahanap. Nasa ibaba ang ilang mga halimbawa:

  • Itugma at kunin ang lahat ng mga email address mula sa isang naibigay na file:

    grep -E -o "\b+@+\.{2, 6}\b" file.txt

    Itugma at kunin ang lahat ng wastong mga IP address mula sa isang naibigay na file:

    grep -E -o '(25|2|??)\.(25|2|??)\.(25|2|??)\.(25|2|??)' file.txt

Ang opsyon na -o ay ginagamit upang mai-print lamang ang string ng pagtutugma.

I-print ang Mga Linya Bago Isang Tugma

Upang mag-print ng isang tiyak na bilang ng mga linya bago ang mga linya ng pagtutugma, gamitin ang opsyon na -B (o --before-context ).

Halimbawa, upang ipakita ang limang linya ng nangungunang konteksto bago tumutugma sa mga linya, gagamitin mo ang sumusunod na utos:

grep -B 5 root /etc/passwd

I-print ang Mga Linya Matapos ang isang Tugma

Upang mag-print ng isang tiyak na bilang ng mga linya pagkatapos ng mga linya ng pagtutugma, gamitin ang opsyon na -A (o - --after-context ).

Halimbawa upang ipakita ang limang linya ng konteksto ng trailing pagkatapos ng pagtutugma ng mga linya, gagamitin mo ang sumusunod na utos:

grep -A 5 root /etc/passwd

Konklusyon

Pinapayagan ka ng utos na grep na maghanap para sa isang pattern sa loob ng mga file. Kung isang tugma kung nahanap, grep ay mag-print ng mga linya na naglalaman ng tinukoy na pattern.

Marami pa ang dapat malaman tungkol sa Grep sa pahina ng Manwal na Gumagamit ng Grep.

terminal ng grep