Paano Magamit ang grep Command sa Linux
Ang Linux grep
Ang utos ay isang string at pattern na tumutugma sa utility na nagpapakita ng mga tumutugma na linya mula sa maraming mga file. Gumagawa din ito sa piped output mula sa iba pang mga utos. Ipinapakita namin sa iyo kung paano.
Ang Kuwento sa Likod ng grep
Ang grep
Ang utos ay sikat sa mga lupon ng Linux at Unix para sa tatlong kadahilanan. Una, ito ay napakalaking kapaki-pakinabang. Pangalawa, ang kayamanan ng mga pagpipilian ay maaaring maging napakalaki. Pangatlo, isinulat ito sa magdamag upang masiyahan ang isang partikular na pangangailangan. Ang unang dalawa ay putok sa; ang pangatlo ay bahagyang naka-off.
Kinuha ni Ken Thompson ang regular na mga kakayahan sa paghahanap ng expression mula sa ed
editor (binibigkas na ee-dee) at lumikha ng isang maliit na programa — para sa kanyang sariling paggamit — upang maghanap sa pamamagitan ng mga file ng teksto. Ang kanyang pinuno ng departamento sa Bell Labs na si Doug Mcilroy, ay lumapit kay Thompson at inilarawan ang problemang kinakaharap ng isa niyang kasamahan na si Lee McMahon.
Sinusubukan ni McMahon na makilala ang mga may-akda ng mga papeles na Pederalista sa pamamagitan ng pagsusuri sa tekstuwal. Kailangan niya ng isang tool na maaaring maghanap para sa mga parirala at mga string sa loob ng mga file ng teksto. Ginugol ni Thompson ang halos isang oras sa gabing iyon sa paggawa ng kanyang tool na isang pangkalahatang utility na maaaring magamit ng iba at palitan itong pangalan bilang grep
. Kinuha niya ang pangalan sa ed
utos ng utos g / re / p
, na isinasalin bilang "pandaigdigang regular na paghahanap ng expression."
Maaari mong panoorin si Thompson na nakikipag-usap kay Brian Kernighan tungkol sa pagsilang ni grep
.
Mga Simpleng Paghahanap Sa grep
Upang maghanap para sa isang string sa loob ng isang file, ipasa ang termino para sa paghahanap at ang pangalan ng file sa linya ng utos:
Ipinapakita ang mga linya ng pagtutugma. Sa kasong ito, ito ay isang solong linya. Ang pagtutugma ng teksto ay naka-highlight. Dahil ito sa karamihan ng mga pamamahagi grep
ay nai-alias sa:
alias grep = "grep --colour = auto"
Tingnan natin ang mga resulta kung saan maraming mga linya ang tumutugma. Hahanapin namin ang salitang "Karaniwan" sa isang file ng log ng application. Dahil hindi namin matandaan kung ang salita ay nasa maliit na file sa log file, gagamitin namin ang -ako
(Huwag pansinin ang kaso) na pagpipilian:
grep -i Average geek-1.log
Ang bawat linya ng pagtutugma ay ipinapakita, kasama ang pagtutugma ng teksto na naka-highlight sa bawat isa.
Maaari naming ipakita ang mga hindi tumutugma na linya sa pamamagitan ng paggamit ng pagpipiliang -v (invert match).
grep -v Mem geek-1.log
Walang pagha-highlight dahil ito ang mga hindi tumutugma na linya.
Maaari tayong maging sanhi grep
upang maging tahimik na tuluyan. Ang resulta ay naipasa sa shell bilang isang halaga ng pagbabalik mula sa grep
. Ang isang resulta ng zero ay nangangahulugang ang string ay natagpuan, at isang resulta ng isang ibig sabihin nito ay hindi natagpuan Maaari naming suriin ang return code gamit ang $?
mga espesyal na parameter:
grep -q average geek-1.log
echo $?
grep -q howtogeek geek-1.log
echo $?
Mga Recursive na Paghahanap Sa grep
Upang maghanap sa pamamagitan ng mga nakapaloob na direktoryo at subdirectory, gamitin ang pagpipiliang -r (recursive). Tandaan na hindi ka nagbibigay ng isang pangalan ng file sa linya ng utos, dapat kang magbigay ng isang landas. Narito kami naghahanap sa kasalukuyang direktoryo na "." at anumang mga subdirectory:
grep -r -i memfree.
Kasama sa output ang direktoryo at filename ng bawat tumutugma na linya.
Kaya nating gumawa nggrep
sundin ang mga simbolikong link sa pamamagitan ng paggamit ng -R
(Recursive dereferance) na pagpipilian. Mayroon kaming isang simbolikong link sa direktoryong ito, na tinawag mga log-folder
. Itinuturo nito sa / home / dave / logs
.
ls -l logs-folder
Ulitin natin ang aming huling paghahanap gamit ang-R
(Recursive dereferance) na pagpipilian:
grep -R -i memfree.
Sinusundan ang simbolikong link at ang direktoryo na tinuturo nito ay hinanap ng grep
ganun din
Naghahanap ng Buong Salita
Bilang default, grep
tutugma sa isang linya kung ang target ng paghahanap ay lilitaw kahit saan sa linyang iyon, kasama ang loob ng isa pang string. Tingnan ang halimbawang ito. Hahanapin namin ang salitang "libre."
grep -i libre geek-1.log
Ang mga resulta ay mga linya na may string na "libre" sa kanila, ngunit hindi sila magkakahiwalay na mga salita. Bahagi sila ng string na "MemFree."
Upang pilitin grep
upang maitugma lamang ang magkakahiwalay na "mga salita", gamitin ang -w
(salita regexp) na pagpipilian.
grep -w -i libre geek-1.log
echo $?
Sa oras na ito walang mga resulta dahil ang term na hinahanap na "libre" ay hindi lilitaw sa file bilang isang hiwalay na salita.
Paggamit ng Maramihang Mga Tuntunin sa Paghahanap
Ang -E
Pinapayagan ka ng pagpipiliang (pinalawak na regexp) na maghanap para sa maraming mga salita. (Ang -E
Pinalitan ng opsyon ang hindi na ginagamit egrep
bersyon ng grep
.)
Naghahanap ang utos na ito ng dalawang mga termino para sa paghahanap, "average" at "memfree."
grep -E -w -i "average | memfree" geek-1.log
Ang lahat ng mga tumutugmang linya ay ipinapakita para sa bawat isa sa mga term ng paghahanap.
Maaari ka ring maghanap para sa maraming mga term na hindi kinakailangang buong salita, ngunit maaari rin silang maging buong salita.
Ang -e
Pinapayagan ka ng pagpipiliang (mga pattern) na gumamit ng maraming mga termino para sa paghahanap sa linya ng utos. Ginagamit namin ang regular na tampok na expression na bracket upang lumikha ng isang pattern sa paghahanap. Sinasabi nito grep
upang maitugma ang alinman sa mga character na nilalaman sa loob ng mga bracket na "[]." Ibig sabihin nito grep
ay tumutugma sa alinman sa "kB" o "KB" sa paghahanap nito.
Ang parehong mga string ay naitugma, at, sa katunayan, ang ilang mga linya ay naglalaman ng parehong mga string.
Pagtutugma ng Mga Linya na Eksakto
Ang-x
(line regexp) ay tutugma lamang sa mga linya kung saan ang buong linya tumutugma sa termino para sa paghahanap. Maghanap tayo para sa isang stamp ng petsa at oras na alam nating lumilitaw isang beses lamang sa log file:
grep -x "20-Ene - 06 15:24:35" geek-1.log
Ang solong linya na tumutugma ay matatagpuan at ipinapakita.
Ang kabaligtaran nito ay ipinapakita lamang ang mga linya na huwag tugma Maaari itong maging kapaki-pakinabang kapag tinitingnan mo ang mga file ng pagsasaayos. Mahusay ang mga komento, ngunit kung minsan mahirap makita ang mga aktwal na setting sa kanilang lahat. Narito ang / etc / sudoers
file:
Maaari naming epektibong i-filter ang mga linya ng komento tulad nito:
sudo grep -v "#" / etc / sudoers
Mas madali iyon i-parse.
Nagpapakita lamang ng Tugma na Teksto
Maaaring may isang okasyon kung hindi mo nais na makita ang buong linya ng pagtutugma, ang katugmang teksto lamang. Ang -o
Ang pagpipiliang (tumutugma lamang) ay ginagawa lamang iyan.
grep -o MemFree geek-1.log
Ang display ay nabawasan sa pagpapakita lamang ng teksto na tumutugma sa termino para sa paghahanap, sa halip na ang buong linya ng pagtutugma.
Nagbibilang Sa grep
grep
hindi lamang tungkol sa teksto, maaari rin itong magbigay ng impormasyong pang-numero. Kaya nating gumawa ng grep
bilangin sa amin sa iba't ibang paraan. Kung nais naming malaman kung ilang beses lumilitaw ang isang termino para sa paghahanap sa isang file, maaari naming gamitin ang -c
(bilangin) na pagpipilian.
grep -c average geek-1.log
grep
Iniuulat na ang termino para sa paghahanap ay lumilitaw nang 240 beses sa file na ito.
Maaari kang gumawa grep
ipakita ang numero ng linya para sa bawat linya ng pagtutugma sa pamamagitan ng paggamit ng -n
(line number) na pagpipilian.
grep -n Jan geek-1.log
Ang numero ng linya para sa bawat linya na tumutugma ay ipinapakita sa simula ng linya.
Upang mabawasan ang bilang ng mga resulta na ipinakita, gamitin ang -m
(max count) na pagpipilian. Malilimitahan namin ang output sa limang linya ng pagtutugma:
grep -m5 -n Jan geek-1.log
Pagdaragdag ng Context
Makakakita ng ilang mga karagdagang linya — posibleng mga linya na hindi tumutugma — para sa bawat linya ng pagtutugma ay madalas na kapaki-pakinabang. makakatulong ito na makilala kung alin sa mga katugmang linya ang iyong interes.
Upang ipakita ang ilang mga linya pagkatapos ng pagtutugma ng linya, gamitin ang pagpipiliang -A (pagkatapos ng konteksto). Humihiling kami ng tatlong linya sa halimbawang ito:
grep -A 3 -x "20-Ene-06 15:24:35" geek-1.log
Upang makita ang ilang mga linya mula bago ang pagtutugma ng linya, gamitin ang -B
(konteksto bago) pagpipilian.
grep -B 3 -x "20-Ene-06 15:24:35" geek-1.log
At upang isama ang mga linya mula bago at pagkatapos ng pagtutugma ng linya gamitin ang -C
(konteksto) na pagpipilian.
grep -C 3 -x "20-Ene-06 15:24:35" geek-1.log
Ipinapakita ang Mga Pagtutugma ng Mga File
Upang makita ang mga pangalan ng mga file na naglalaman ng termino para sa paghahanap, gamitin ang -l
(Mga file na may tugma) na pagpipilian. Upang malaman kung aling mga file ng source code ng C ang naglalaman ng mga sanggunian sa sl.h
header file, gamitin ang utos na ito:
grep -l "sl.h" * .c
Ang mga pangalan ng file ay nakalista, hindi ang mga tumutugma na linya.
At syempre, maaari tayong maghanap ng mga file na hindi naglalaman ng term ng paghahanap. Ang -L
Ang pagpipiliang (mga file nang walang tugma) ay ginagawa lamang iyan.
grep -L "sl.h" * .c
Simula at Wakas ng mga Linya
Maaari nating pilitin grep
upang ipakita lamang ang mga tugma na alinman sa simula o sa pagtatapos ng isang linya. Ang regular na operator ng ekspresyon na "^" ay tumutugma sa pagsisimula ng isang linya. Halos lahat ng mga linya sa loob ng log file ay maglalaman ng mga puwang, ngunit maghahanap kami para sa mga linya na may puwang bilang kanilang unang character:
grep "^" geek-1.log
Ang mga linya na mayroong puwang bilang unang tauhan — sa simula ng linya — ay ipinapakita.
Upang maitugma ang pagtatapos ng linya, gamitin ang "$" regular na operator ng ekspresyon. Hahanapin namin ang mga linya na nagtatapos sa "00."
grep "00 $" geek-1.log
Ipinapakita ng display ang mga linya na may "00" bilang kanilang huling mga character.
Paggamit ng Mga Pipe na may grep
Siyempre, maaari kang mag-input ng tubo sa grep
, tubo ang output mula sa grep
sa ibang programa, at mayroon grep
matatagpuan sa gitna ng isang kadena ng tubo.
Sabihin nating nais nating makita ang lahat ng mga paglitaw ng string na "ExtractParameter" sa aming mga C source code file. Alam naming magkakaroon ng iilan, kaya't pinapasok namin ang output mas kaunti
:
grep "ExtractParameter" * .c | mas kaunti
Ang output ay ipinakita sa mas kaunti
.
Hinahayaan ka nitong pahina sa pamamagitan ng listahan ng file at upang magamit mas kaunti
pasilidad sa paghahanap.
Kung pipino namin ang output mula sa grep
sa wc
at gamitin ang -l
(Mga linya) na pagpipilian, maaari nating bilangin ang bilang ng mga linya sa mga file ng source code na naglalaman ng "ExtractParameter". (Maaari nating makamit ito gamit ang grep
-c
(Bilangin) na pagpipilian, ngunit ito ay isang maayos na paraan upang maipakita ang paglabas ng grep
.)
grep "ExtractParameter" * .c | wc -l
Sa susunod na utos, piping namin ang output mula sa ls
sa grep
at piping ang output mula sa grep
sa pag-uri-uriin
. Inililista namin ang mga file sa kasalukuyang direktoryo, pinipili ang mga may string na "Ago" sa mga ito, at inaayos ang mga ito ayon sa laki ng file:
ls -l | grep "Ago" | pag-uuri + 4n
Tanggalin natin iyon:
- ls -l: Magsagawa ng isang mahabang listahan ng format ng mga file na ginagamit
ls
. - grep "Ago": Piliin ang mga linya mula sa
ls
listahan na mayroong "Aug" sa kanila. Tandaan na mahahanap din nito ang mga file na may "Aug" sa kanilang mga pangalan. - pag-uuri + 4n: Pagbukud-bukurin ang output mula sa grep sa ika-apat na haligi (fileize).
Nakukuha namin ang isang pinagsunod-sunod na listahan ng lahat ng mga file na binago noong Agosto (anuman ang taon), sa pataas na pagkakasunud-sunod ng laki ng file.
KAUGNAYAN:Paano Gumamit ng Mga Pipe sa Linux
grep: Mas kaunti sa isang Utos, Higit pa sa isang kapanalig
grep
ay isang kakila-kilabot na tool na magagamit mo. Nagsimula ito mula 1974 at patuloy pa rin itong lumalakas dahil kailangan natin kung ano ang ginagawa nito, at wala nang mas mahusay.
Pagkabit grep
na may ilang mga regular na expression-fu talagang dadalhin ito sa susunod na antas.
KAUGNAYAN:Paano Gumamit ng Pangunahing Regular na Mga Ekspresyon upang Maghanap ng Mas mahusay at Makatipid ng Oras