Grep. Du hører det mye. Du ser de krypterte IT-gutta som skriver kommandoen, systemadministratorer nevner det i forbifarten, du ser det til og med i noen shell-skript. Det virker som en av de tingene som bare eksisterer, men er ikke ment for deg. Denne artikkelen vil forandre det - vi vil forklare og ta en rask titt på grep (og den mindre kjente vennen sin) i denne nyeste versjonen av OS X Demystified.
Grep er et kommandolinjeverktøy for å søke og filtrere noen form for tekstinngang basert på parametere du mater den
Grep er et kommandolinjeverktøy for å søke og filtrere noen form for tekstinngang basert på parametere du mater den. Med andre ord går det i terminalen (Programmer → Verktøy → Terminal), og brukes utelukkende ved å skrive kommandoer. Det er selvfølgelig GUI wrappers som hjelper litt, men ingen er like kraftige eller allsidige som bein kommandolinjebruken, så det er det vi skal fokusere på.
Det er alt fint, men hva gjør det egentlig? Lyder det ovenfor for vage? Her er et eksempel. Si at du har en blokk med tekst i en fil kalt jungle.txt med fem linjer:
En løve sover i jungelen En løve sover i natt En tiger våkner i sumpen Papegøyen observerer Wimoweh, wimoweh, wimoweh, wimoweh
For å finne linjen som inneholder ordet tiger, bruker vi grep således:
grep tiger jungle.txt
Resultatet vi får er:
"En tiger våkner i sumpen"
Ok, det er klart, ikke sant? La oss ta et skritt tilbake skjønt.
Som det viser seg Mac grep er tregere enn GNU grep, så la oss gjøre en oppgradering først. For å installere et raskere grep, skriv inn følgende i Terminal og trykk Tast inn:
brygge installasjon https://raw.github.com/Homebrew/homebrew-dupes/master/grep.rb
Vær oppmerksom på at du trenger Homebrew installert for å kunne gjøre dette, og for å finne ut hvordan du installerer Homebrew, se min forrige artikkel.
Et bredt spekter av geeklets vil ofte stole på grep for å hente data fra store tekstfiler eller høstede nettsteder
Hva har vi oppnådd ved å utføre denne oppgraderingen? Vel, mange apper bruker det installerte native grep verktøyet til å fungere. For eksempel vil et bredt spekter av geeklets ofte stole på grep for å hente data fra store tekstfiler eller høstede nettsteder. Og dermed, alle dine grep-bruk geeklets vil nå være flere ganger raskere i sine greppy deler. I tillegg må du kanskje grep noen form for feillogg (la oss si at du har en stor feillogg fra et program, og appens støttetjeneste forteller deg å lime dem "grep port-1723"). Hvis loggen har millioner av kodelinjer, kan du spare mye tid ved å bruke denne mye raskere grep.
Når Homebrew installerer ditt nye grep, prøv å gjøre følgende hvis du lagde filene. Hvis ikke, gå videre og lag dem, og kjør deretter kommandoen for å sikre at alt fungerer.
grep tiger jungle.txt
Sed er a stream editor. Sett stygt, det tar innspill, redigerer det og sender ut det redigerte innholdet. Enten det er redigering i en fil eller blir matet direkte fra Terminal, er det helt irrelevant for sed - den har en svært avansert og konfigurerbar funksjon, og utfører den til sitt beste.
Sed tar litt tekstinngang, en kommando på hvordan man endrer den, og produserer endret utgang
Så hvor er sed brukt? Redigering av filinnhold og lignende, selvfølgelig, men det skjer bare slik at det fungerer feilfritt hånd i hånd med grep. La oss se noen rene sed eksempler først, skjønt. Skriv inn følgende i Terminal:
ekko "Hei"
og trykk enter. Terminalen sier hei. Skriv nå
ekko "Hei" | sed 's / Hell / Heaven /'
og trykk enter. Du bør se "Heaveno". Hva skjedde nå? Se, sed arbeider ved å ta to argumenter. Den første er fôr, inngangen, og den andre er en streng (du kan se at det er en streng fordi den er sitert) som forteller det hvilke handlinger som skal utføres på det første argumentet. I vårt tilfelle er det:
Det andre listepunktet nevner alternativer til den fremre skråstreken noen ganger kommer de til å være veldig nyttige på grunn av å skrive, for eksempel, nettadresser eller filbaner. Ta for eksempel nettadressen MyFolder / mysubfolder / myfile
. Hvis vi setter dette inn i sed for å erstatte det med myotherfolder / myotherfile
, parameteren vil se slik ut: s / MyFolder / mysubfolder / myfile / myotherfolder / myotherfile /
som bare er en stor pose med tull - sed kan ikke muligens vite hvilken av disse fragmentene som er regexp og hvilken er erstatningsstrengen. Derfor måtte vi flukt Forspenningene i vår filepath med backslash, så vil hver forspenning i banen bli til \ /
. Jeg gjetter at du kan se problemet. Den nye sed-parameteren ser slik ut:
sed 's / myfolder \ / mysubfolder \ / myfile / myotherfolder \ / myotherfile /'
Dette knapt lesbare formatet kalles en "hakk", og for å unngå det, støtter sed forskjellige avgrensere som understrekning (_), kolon (:) og rør (|). For eksempel, hvis vi ønsket å bruke rørkarakter som avgrenser, ville vi ende opp med følgende:
sed 's | myfolder / mysubfolder / myfile | myotherfolder / myotherfile |'
Mye bedre, nei?
En annen ting, skjønt. Vi sa sed tar to argumenter, men vi gir det bare en gang - like etter sed
kommando. Dette er på grunn av rørkarakteren etter vår ekko
kommando. Røret tjener som et middel til å lede utgangen fra venstre operand til inngangen til høyre operand. I vårt tilfelle fortalte rørkarakteren sed
program "Ta som input hva det er som du får fra hva det er på venstre side av meg". sed
har ingen anelse om at det handler om ekko - det trenger ikke å vite. Alt det vet er at det tar tekstinngang. Diskutere rørledningen mer detaljert enn dette er utenfor rammen av denne artikkelen, men vær så snill å lese om du er interessert.
Røret tjener som et middel til å lede utgangen fra venstre operand til inngangen til høyre operand.
Så hvordan kombinerer vi det med grep? Det er akkurat det samme. Ta med vårt forrige eksempel, la oss skrive inn følgende i terminalen.
grep tiger jungle.txt | sed 's / sump / ørken /'
og vi får produksjonen
"En tiger våkner i ørkenen"
La oss se på en ekte verdensbrukstilfelle.
For "disseksjonen" tar vi grep + sed-kommandoen til et populært værkrok og forklarer det litt etter litt. Gå videre og last ned prøveekseklet. Når du er lastet ned, åpne den med en tekstredigerer av noe slag. Du vil legge merke til at det ikke er mer enn en XML-fil. Hvis du ikke har erfaring med XML, ikke vær redd - Josh har allerede gjort en fantastisk artikkel om Geektool og dens inn og ut. Vi kommer ikke til å arbeide med det nitty gritty av det hele i dag. I stedet la oss fokusere på delen mellom
tags:
curl - silent "http://xml.weather.yahoo.com/forecastrss?w=28348727&u=c" | grep -E '(nåværende forhold: | C
// '-e' s /// '-e' s /<\/b>// '-e' s /
// '-e' s /// '-e s /<\/description>//'
Dette kryptiske rotet er en enkel Terminal-kommando - ingenting mer. Du kan til og med lime den inn i Terminal, og du vil få værforholdene for Makati City på Filippinene, som den opprinnelige forfatteren satte for å hente. Geekleten forteller Geektool å kjøre kommandoen og ta hva som helst utgang det blir ved å kjøre det. La oss ta en titt på det, rørsegmentet etter rørsegmentet, og forklar det i detalj:
curl - silent "http://xml.weather.yahoo.com/forecastrss?w=28348727&u=c"
curl
er et verktøy for overføring av data med en URL-syntaks. Dette betyr at det kan gå til en nettadresse og hente data fra den.
Krøll er et verktøy som brukes til å overføre data med en URL-syntaks på kommandolinjen
Hvis du limer inn den oppgitte nettadressen i nettleseren din (eller bare klikker her), vil du legge merke til at du får en XML-fil fra Yahoo! - de har live værforhold service som du lett kan få tilgang til og hente data fra. Dette er nøyaktig det samme du får når du curl
den; Bare i stedet for nettleseren, sendes inngangen til Terminal. De --stille
flagg forteller krøll for å være stille om fremdrift, status og feil, slik at den eneste produksjonen vi får, er produksjonen vi trenger (eller ingenting, hvis det mislykkes).
grep -E '(nåværende forhold: | C
Rørkarakteren følger, som betyr produksjonen fra
curl
er sendt til grep som input. Grep mottar denne nedlastede XML-filen i tekstformat, og kjører et søk på det med-E
flagg, som betyr utvidet regelmessig uttrykk. Verdien den søker etter er enten strengenNåværende forhold:
ellerC
(rørkarakteren inne i en ereg betyr "eller"). For ytterligere avklaring, hvis du skrev følgende inn i vårt tidligere eksempel:grep -E '(tiger | weh)' jungle.txtdu ville få
En tiger våkner i sumpen Wimoweh, wimoweh, wimoweh, wimowehfordi det returnerer alle linjer som inneholder enten "tiger" eller "weh".
Så hvis vi løper disse to første rørsegmentene sammen slik:
curl - silent "http://xml.weather.yahoo.com/forecastrss?w=28348727&u=c" | grep -E '(nåværende forhold: | C
vi får følgende:
Nåværende forhold:
Haze, 23 CMen vi vil bare få "Haze, 23 C". Dette er hvor
sed
kommer inn. Vi erstatter rett og slett alt vi ikke vil ha med en tom streng (ingenting) effektivt sletter den.sed-s / Nåværende forhold: // '-e' s /
// '-e' s /// '-e' s /<\/b>// '-e' s /
// '-e' s /// '-e s /<\/description>//'De
-e
flagget er kort for--uttrykket =
og tillater oss å kjede fleresed
kommandoer. Derfor erstatter vi først strengen "Gjeldende betingelser:" med ingenting, etterfulgt av erstatningmed ingenting, osv. til vi når den mulige enden av linjen (
).
Til slutt er alt som er igjen, "Haze, 23 C".
Jeg bør nevne at nekletet vi har brukt som et eksempel, kunne ha blitt gjort langt bedre, men den rene kompleksiteten til den brukte kommandoen virket som en veldig god mulighet til å dekke flere eksempler på en gang. Forfatteren kunne for eksempel bare ha hentet linjen som inneholder "Gjeldende forhold:" og linjen etter den med
-A 1
flaggkombination, uten å stole på temperatur symbolet (i dette tilfellet stoler vi på Celsius, men hva om vi ønsket Fahrenheit? ForfatterensC
grepsøk ville mislykkes). Men eksemplet tjente en hensikt - og det var å introdusere deg til den fantastiske verden avgrep
ogsed
.
Flere ressurser
Mens du lærer avanserte vanlige uttrykk og dypere grep, er curl og sed-funksjonalitet langt utenfor omfanget av denne artikkelen (og dette nettstedet), gjerne se på følgende ressurser hvis du vil vite mer.
Du kjenner nå grunnleggende om grep
, sed
Til og med curl
. Selv om dette kurset var langt fra nok til å gjøre deg til en ekspert, håper vi det var minst nok til å få deg interessert i å prøve din egen datahøsting og spørring. I det minste er det noe å snakke om rundt vannkjøleren på mandag.
Jeg håper du likte det, og hvis du er ute etter en utfordring, prøv å skrive om Geeklet for ikke bare å være temperatur symbolet agnostiker, men også å finne ut brukerens plassering på egenhånd, uten å måtte manuelt endre 'w 'parameter i Yahoo! URL.