grep tai yra vienas iš dažniausiai naudojamų įrankių GNU / Linux komandinėje eilutėje. Nepaisant to, kad tai labai paprastas įrankis, jis leidžia jums atlikti daugybę operacijų. Jis ypač naudojamas kartu su vamzdžiais, kad būtų galima nustatyti konkrečius taškus ankstesnės komandos išvestyje ir kt. Tačiau yra ir įrankis, žinomas kaip egrep, kuris prilygsta grep paleidimui su -E parinktimi.
El gaunamas iš „Extended regex“, kuris suaktyvina -E parinktį ir tai, ką pagal nutylėjimą turite egrep, nenaudodami šios parinkties. Tai yra, jūs galite naudoti išplėstiniai reguliarūs posakiai. Šioje pamokoje nenagrinėsiu, kas yra reguliarūs posakiai, kaip juos galima naudoti ir kokie yra „nix“ tipai. Aš tiesiog parodysiu praktinių pavyzdžių, naudingų dalykų, kuriuos galite padaryti naudodami egrep ...
grep, egrep ir fgrep yra panašūs. Tiesą sakant, egrep yra lygiavertis grep -E, o fgrep - grep -F. Tai reiškia, kad mums rūpimu atveju ji taip pat interpretuos modelius kaip įprastus posakius.
Jums ieškoti eilutės ar žodžio viename ar keliuose failuose, kaip tai daroma ir grep. Pvz., Įsivaizduokite, kad norite ieškoti žodžio „ubuntu“ faile, pavadintame snap.txt, taip pat visuose dabartinio katalogo .txt failuose:
egrep ubuntu snap.txt
egrep ubuntu *.txt
Paieškos taip pat gali būti rekursinis Norėdami ieškoti visame dabartinio katalogo turinyje:
egrep -r "hola mundo" *
Iki šiol buvo ieškoma tikslių žodžių ar eilučių, ty atsižvelgiant į didžiąsias ir mažąsias raides (didžiosios ir mažosios raidės), bet jei norite tai padaryti mažųjų ir mažųjų raidžių režimu, nesvarbu, ar jos yra didžiosios, ar mažosios, galite naudoti šiuos veiksmus (jei pridėsite w, jis suras tik visas atitiktis):
egrep -i "ejemplo" documento.txt
egrep -iw "ejemplo" documento.txt
Laida, ne sutapimai, o failų pavadinimai, kuriuose buvo rasti tie atitikmenys:
egrep -l hola *.txt
Rodyti tik šabloną ar žodį ieškojo dokumente:
egrep -o printf hola.c
Atminkite, kad galite pasinaudoti visomis galimybėmis, kurias tik galite įsivaizduoti. Galite sujungti keletą anksčiau matytų parinkčių arba galite jas papildyti kitomis parinktimis, tokiomis kaip -A n ir -B n, kur n eilučių, kurias norite rodyti prieš (prieš) ir po (po), skaičius rungtynių arba abiejų vienu metu (C), kad galėtumėte pamatyti, kas supa mačą:
egrep -A 2 "printf" hola.c
egrep -B 2 "printf" hola.c
egrep -C 2 printf hola.c
Nutraukti eilutes, kuriose yra atitikmuo, ir rodyti tik tas, kurios neatitinka:
egrep -v "dos" números.doc
Arba, jei norite, galite naudoti kelis žodžius ar atitikmenis su -e. Por ejemplo:
egrep -v -e "uno" -e "dos" -e "tres" números.txt
Jei naudojate -c gali suskaičiuoti tik rungtynių skaičiųarba apverskite jį naudodami -v, kad parodytumėte neatitinkančių eilučių skaičių. Pavyzdžiui:
egrep -c "include" main.c
egrep -v -c "include" main.c
Ir netgi rodyti eilutės numerį ten, kur įvyko rungtynės, ir poziciją, kurią jie užima:
egrep -n "void" hola.c
egrep -o -b "printf" hola.c
Ir kartu su reguliarūs posakiai jos galimybes galima išplėsti. Pvz., Raskite eilutę, kuri prasideda Hello ir baigiasi bye, arba kuri prasideda Hello, po kurios seka bet kas, o tada pasirodys atitinkamas atsisveikinimas:
* Šios komandos taisymas: skaitytojo Manuelio Alcocerio komentaro dėka pavyko pakeisti šią komandą, nes įvyko klaida.
egrep '^Hola.*adiós$' ejemplo.txt
egrep "Hola.*adiós" ejemplo.txt
Bet jei jums įdomu, koks skirtumas su „grep“, pateikite pavyzdį, kuris tai aiškiai parodys ... Jei naudojate „grep“ be -E, turėtumėte naudoti pabėgimo sekos kad aiškintų specialiuosius simbolius kaip tokius, kitaip interpretuotų modelį kaip tokį, neatsižvelgdamas į juos. Kita vertus, naudodamas egrep arba grep -E, jis į juos atsižvelgs. Pavyzdžiui:
grep '^no\(fork\|group\)' /etc/group
Tai būtų tolygu:
grep -E '^no(fork|group)' /etc/group
egrep '^no(fork|group)' /etc/group
Tai yra, jis ieškotų atitinkančių eilučių, prasidedančių nofork arba nogroup. Bet jei jūs naudojote pirmąją „grep“ išraišką be pabėgimo sekų, tai būtų ieškojimas betono modelis ne (šakutė | grupė):
grep 'no(fork|group)' /etc/group
Taip pat galite ieškoti raidiniai ir skaitiniai diapazonai, arba konkrečias reikšmes, pvz., tam tikrų IP nustatymui
cat /etc/networks | egrep "192.168.1.[5-9]"
cat /etc/networks | egrep "192.168.[1-3].[5-9]"
cat /etc/networks | egrep "192.168.1.[0-3]|[5-9]"
egrep 192.168.4.[10,40] networks
Jei norite, galite naudoti kitus įprastus posakius, kad atliktumėte konkretesnes paieškas. Pavyzdžiui | kad surastum sutapimas ar kitas:
egrep -i '^(printf|scanf)' hola.c
Jūs netgi galite rasti didžiosios, mažosios, tik abėcėlės arba raidinės ir skaitmeninės raidės ir kt., naudojant kitas išraiškas, tokias kaip: [: alnum:], [: alfa:], [: digit:], [: lower:], [: print:], [: punct:], [: space:], [ : viršutinė:] ir kt. Pavyzdžiui, jei norite ieškoti didžiųjų raidžių:
egrep [[:upper:]] diccioario
Tikiuosi, kad tai jums padės ... Netrukus paaiškinsiu reguliarias išraiškas specialiai jai skirtame straipsnyje ...
Laba diena.
Kelios pastabos ...
Paaiškinate komandą „egrep“, bet nedėkite skirtumo tarp „egrep“ ir „grep“, kurie čia turėtų būti.
Pavyzdžiui:
Su grep: ip -4 a | grep '[0-9] \ +'
Su egrep: ip -4 a | egrep '[0-9] +'
Ahh, ir tai neteisinga, 'egrep „Sveiki. sėkmė čia įvyksta, kai faile yra eilutė, kurioje yra eilutė „Sveiki“, po kurios seka bet kas, o po to - „sudie“, eilutė tikrai gali prasidėti ir baigtis bet kuo.
Tai būtų tai, ką sako straipsnis:
egrep '^ Sveiki. * bye $' example.txt
Visi variantai arba beveik visi (aš nenustoju to patikrinti) yra „grep“, o ne tik „egrep“ variantai.
Su geriausiais linkėjimais.
Dėkojame, kad pranešėte apie klaidą. Tai, ką komentuojate reguliariais posakiais, aš jau dedu į antrą pastraipą. Skirsiu jiems konkretų straipsnį, nes jų yra daug ir šis straipsnis užtruktų per ilgai. Sveikinimas!
Sveikas dar kartą, Izaokai.
Antroje pastraipoje jūs iš esmės sakote arba turėjote pasakyti, kad „egrep“ yra „grep -E“ pseudonimas, tačiau nepateikiate „egrep“ naudojimo su tam tikra taisyklinga išraiška, kuri parašyta kitaip nei naudojamas „grep“.
Skirti straipsnį paaiškinti išplėstines reguliariąsias išraiškas man atrodo drąsu, be kita ko, nes yra tokių svetainių, kurios nereklamuoja ir atlieka labai svarbų GNU bendruomenės informacinį darbą: https://www.rexegg.com/
Aš nerašau čia dėl trolinimo, mano ketinimas yra tai, kad jei kas nors perskaitys šį įrašą, norėdamas pamatyti, ką daro „egrep“ ar „grep“, prašau pažvelgti į kitus šaltinius, šis įrašas negali būti nuoroda į nieką, jis mažai ką paaiškina , blogai, siūlo nereikalingą informaciją ir gali būti painu, ypač tiems, kurie neturi žinių apie GNU ir galingus jo siūlomus įrankius.
Galiausiai pridėjote ir ištaisėte klaidą, kurią nurodžiau po pirmojo komentaro (^ $). Kaip ir kitose svetainėse, turėtumėte nurodyti asmenį, kuris padarė pataisą, arba bent jau pasakyti, kad tai yra pataisymas, kuris yra GNU bazės dalis, ta pati bazė, su kuria buvo sukurtas ir pamestas šis tinklaraštis.
Pasisveikinimas.
Dėkoju už jūsų požiūrį.
ffff