Grep. Ai auzit foarte mult. Vedeți tipii ăștia cripți din IT care scriu comanda, administratorii de sistem o menționează în trecere, chiar o vedeți în unele scripturi de shell. Se pare că unul dintre acele lucruri există, dar nu este destinat pentru tine. Acest articol va schimba asta - vom explica și vom arunca o privire rapidă la grep (și prietenul său mai puțin cunoscut sed) în această nouă versiune de OS X Demystified.
Grep este un utilitar pentru linia de comandă pentru căutarea și filtrarea unui tip de intrare textuală pe baza parametrilor pe care îi hrăniți
Grep este un utilitar pentru linia de comandă pentru căutarea și filtrarea unui tip de intrare textuală pe baza parametrilor pe care îi hrăniți. Cu alte cuvinte, rulează în Terminal (Aplicații → Utilitare → Terminal), și este folosit exclusiv prin tastarea comenzilor. Există, desigur, învelișuri GUI care ajută puțin, dar nici una nu este la fel de puternică sau versatilă ca utilizarea liniei de comandă a oaselor goale, de aceea ne vom concentra pe.
Asta e frumos, dar ce face de fapt? Sunetul de mai sus este prea vag? Iată un exemplu. Spuneți că aveți un bloc de text într-un fișier numit jungle.txt cu cinci rânduri:
Un leu doarme în junglă Un leu doarme diseară Un tigru se trezește în mlaștină Papagalul observă Wimoweh, wimoweh, wimoweh, wimoweh
Pentru a găsi linia care conține cuvântul tigru, folosim grep astfel:
grep tiger jungle.txt
Rezultatul nostru este:
"Un tigru se trezește în mlaștină"
Ok, e clar, nu? Să facem un pas înapoi, totuși.
După cum se dovedește că Mac grep este mai lent decât GNU grep, să facem mai întâi o actualizare. Pentru a instala un grep mai rapid, introduceți următoarele în Terminal și apăsați introduce:
brew install https://raw.github.com/Homebrew/homebrew-dupes/master/grep.rb
Rețineți că aveți nevoie de Homebrew instalat pentru a putea face acest lucru și pentru a afla cum să instalați Homebrew, consultați articolul meu precedent.
O gamă largă de geekleturi se vor baza adesea pe grep pentru a prelua date din fișiere text mari sau site-uri recoltate
Ce am realizat prin efectuarea acestei actualizări? Multe aplicații utilizează instrumentul nativ grep instalat pentru a funcționa. De exemplu, o gamă largă de geeklets se vor baza adesea pe grep pentru a prelua date din fișiere text mari sau site-uri recoltate. Prin urmare, toate ghețurile dvs. cu grep vor fi acum de mai multe ori mai rapide în părțile lor grepii. În plus, este posibil ca uneori să trebuiască să introduceți un jurnal de erori (să presupunem că aveți un jurnal de erori mare de la o aplicație și serviciul de asistență al aplicației vă spune să le lipiți "grep port-1723"). În cazul în care jurnalul are milioane de linii de cod, puteți economisi o mulțime de timp utilizând acest grep mult mai rapid.
Odată ce Homebrew instalează noul dvs. grep, încercați să faceți următoarele dacă ați făcut fișierele. Dacă nu, continuați și faceți-le, apoi rulați comanda pentru a vă asigura că totul funcționează.
grep tiger jungle.txt
Sed este a sTREAM editor. Așezați-o, este nevoie de intrare, se editează și se emite conținutul editat. Indiferent dacă este editat într-un fișier sau este alimentat direct de la Terminal este complet irelevant pentru sed - are o funcție extrem de avansată și configurabilă și o realizează cât mai bine posibil.
Sed primește o introducere de text, o comandă despre cum să o schimbe și produce o ieșire modificată
Deci unde este folosit sedul? Editarea conținutului fișierului și altele asemenea, desigur, dar se întâmplă astfel încât să funcționeze perfect cu grep. Să vedem mai întâi câteva exemple pure sed, totuși. Introduceți următoarele în Terminal:
ecou "Bună ziua"
și apăsați enter. Terminalul salută. Acum tastați
echo "Bună ziua" sed 's / Hell / Heaven /'
și apăsați enter. Ar trebui să vedeți "Heaveno". Ce s-a intamplat? Vezi, sed lucrează luând două argumente. Primul este feedul, intrarea, iar al doilea este un șir (puteți vedea că este un șir deoarece este citat) care îi spune ce acțiuni trebuie să efectueze pe primul argument. În cazul nostru,
Cel de-al doilea element din listă menționează alternative la delimitatorul de tracțiune laterală; uneori vor veni foarte la îndemână datorită faptului că trebuie, de exemplu, să scrie adrese URL sau căi de fișiere. Luați, de exemplu, url myfolder / mysubfolder / myfile
. Dacă punem acest lucru în sed pentru a-l înlocui myotherfolder / myotherfile
, parametrul ar arăta astfel: s / myfolder / mysubfolder / myfile / myotherfolder / myotherfile /
care este doar o pungă mare de nonsens - sed nu poate ști care dintre aceste fragmente este regexp și care este șirul de înlocuire. De aceea, ar trebui să facem asta evadare antenele de întoarcere în traseul de filepath cu backslash, astfel încât fiecare înainte în calea să se transforme în \ /
. Cred că puteți vedea problema. Parametrul nou sed arată astfel:
sed 's / myfolder \ mysubfolder \ / myfile / myotherfolder \ / myotherfile /
Acest format greu de citit este numit "gard", iar pentru a evita acest lucru, sed suporta diferite delimitatori, cum ar fi underscore (_), colon (:) si pipe (|). De exemplu, dacă vrem să folosim caracterul de țeavă ca delimitator, vom ajunge la următoarele:
sed 's | myfolder / mysubfolder / myfile | myotherfolder / myotherfile |
Mult mai bine, nu?
Un alt lucru, totuși. Am spus că sed are două argumente, totuși îi dăm vreodată una - imediat după sed
comanda. Acest lucru se întâmplă din cauza caracterului de conducte după noi ecou
comanda. Țeava servește ca mijloc de direcționare a ieșirii operandului stâng în intrarea operandului drept. În cazul nostru, caracterul de conductă a spus sed
program "Luați ca intrare ceea ce este că veți obține de la ceea ce există pe partea stângă a mea". sed
nu are idee că are de-a face cu ecou - nu trebuie să știe. Tot ce știe este că ia text. Discutarea conductei cu mai multe detalii decât aceasta este în afara domeniului de aplicare al acestui articol, dar nu ezitați să citiți dacă sunteți interesat.
Țeava servește ca mijloc de direcționare a ieșirii operandului stâng în intrarea operandului drept.
Deci cum o combinăm cu grep? E exact același lucru. Folosind exemplul nostru precedent, să introducem următoarele în terminal.
grep tiger jungle.txt | sed "/ mlaștină / deșert /
și vom obține ieșirea
"Un tigru se trezește în deșert"
Acum, haideți să ne uităm la un caz de utilizare a lumii reale.
Pentru "disecția" noastră vom lua comanda grep + sed a unui geeklet popular de vreme și o vom explica puțin câte puțin. Continuați și descărcați eșantionul de eșantioane. Odată descărcat, deschideți-l cu un editor de text de orice fel. Veți observa că nu este mai mult decât un fișier XML. Dacă nu aveți nici o experiență cu XML, nu vă îngrijorați - Josh a făcut deja un articol uimitor despre Geektool și despre insulele sale. Nu vom avea de-a face cu zgârieturile din toate zilele de astăzi. În schimb, să ne concentrăm asupra părții dintre
Etichete:
curl - silentios "http://xml.weather.yahoo.com/forecastrss?w=28348727&u=c" | grep -E '(Condiții curente: |
// '-e /// '-e /<\/b>// '-e /
// '-e lui ///' -e /<\/description>//“
Această dezordine criptică este o comandă terminală simplă - nimic mai mult. Puteți chiar să o lipiți în Terminal și veți obține condițiile meteorologice pentru orașul Makati din Filipine, pe care autorul original l-a setat să o aducă. Geeklet-ul îi spune lui Geektool să execute comanda respectivă și să ia orice ieșire prin rularea ei. Să aruncăm o privire asupra acestui segment de țevi pe segmentul de țevi și să explicăm în detaliu:
curl - silentios "http://xml.weather.yahoo.com/forecastrss?w=28348727&u=c"
răsuci
este un instrument de transfer de date cu o sintaxă de adrese URL. Aceasta înseamnă că poate merge la o adresă URL și poate prelua date din acesta.
Curl este o unealtă folosită pentru transferul de date cu o sintaxă de URL pe linia de comandă
Dacă inserați adresa URL menționată în browserul dvs. (sau doar faceți clic aici), veți observa că primiți un fișier XML de la Yahoo! - au un serviciu de condiții meteo vii, la care puteți accesa cu ușurință și puteți prelua date de la. Acesta este exact același lucru pe care îl obțineți când vă aflați răsuci
aceasta; numai în loc de browser, intrarea este trimisă la Terminal. --tăcut
steagul spune ca curlul să fie liniștit în ceea ce privește progresul, starea și erorile, astfel încât singura ieșire pe care o obținem este rezultatul de care avem nevoie (sau nimic, dacă nu reușește).
grep -E '(Condiții curente: |
Caracterul de țeavă urmează, adică rezultatul din
răsuci
este trimis în grep ca intrare. Grep primește acest fișier XML descărcat în format text și execută o căutare pe el cu-E
flag, ceea ce înseamnă Expresie regulată extinsă. Valoarea căutată este fie șirulCondițiile actuale:
sauC
(caracterul de țeavă din interiorul unui ereg înseamnă "sau"). Pentru clarificări suplimentare, dacă ați introdus următoarele în exemplul nostru anterior:grep -E '(tiger | weh)' jungle.txtveți obține
Un tigru se trezește în mlaștină Wimoweh, wimoweh, wimoweh, wimowehdeoarece returnează toate liniile care conțin fie "tigru", fie "weh".
Deci, dacă rulam aceste două segmente de țeavă împreună cum ar fi:
curl - silentios "http://xml.weather.yahoo.com/forecastrss?w=28348727&u=c" | grep -E '(Condiții curente: |
obținem următoarele:
Condițiile actuale:
Haze, 23 ° CDar vrem doar să obținem "Haze, 23 C". Aici e locul
sed
vine. Înlocuim pur și simplu orice nu dorim cu un șir gol (nimic) care îl șterge efectiv.sed -e / Condiții curente: // '-e /
// '-e /// '-e /<\/b>// '-e /
// '-e lui ///' -e /<\/description>//“
-e
steagul este scurt pentru--expresie =
și ne permite să lanțăm mai multesed
comenzi. De aceea, in primul rand vom inlocui sirul "Conditii curente:" cu nimic, urmat de inlocuirecu nimic, până când ajungem la capătul posibil al liniei (
).
În final, tot ce rămâne este "Haze, 23 C".
Ar trebui să menționez că geekletul pe care l-am folosit ca exemplu ar fi putut fi făcut mult mai bine, însă complexitatea comenzii utilizate părea o ocazie foarte bună de a acoperi mai multe exemple dintr-o dată. Autorul ar fi putut, de exemplu, să aducă pur și simplu linia care conținea "Condiții curente:" și linia după ea cu
-A 1
fără să se bazeze pe simbolul temperaturii (în acest caz, ne bazăm pe Celsius, dar ce dacă am fi vrut Fahrenheit?C
căutarea grep ar eșua). Cu toate acestea, exemplul a servit unui scop - și care te-a introdus în lumea minunatăgrep
șised
.
Mai multe resurse
În timp ce predați expresii regulate avansate și funcții mai profunde grep, curl și sed sunt departe de domeniul de aplicare al acestui articol (și de acest site), nu ezitați să consultați următoarele resurse dacă doriți să aflați mai multe.
Acum știți elementele de bază ale lui grep
, sed
și chiar răsuci
. În timp ce acest curs de accidente nu a fost suficient de mare pentru a vă face un expert, sperăm că este cel puțin suficient pentru a vă atrage interesul în încercarea de recoltare și interogare de date proprii. Cel puțin, e vorba de ceva despre care să vorbim în jurul coolerului de apă luni.
Sper că v-ați bucurat și dacă sunteți pregătit pentru o provocare, încercați să rescrii Geekletul nu numai ca fiind simbolul temperaturii agnostic, ci și să dați seama de locația utilizatorului singur, fără a fi nevoie să modificați manual " "în Yahoo! URL-.