Grep og sed Demystified

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.


Introduksjon

grep

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.

Oppgradering Grep

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

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:

  • s (erstatning)
  • / (avgrensning - i vårt tilfelle fremoverstrekk, se neste avsnitt for alternativer)
  • Helvete (vanlig uttrykksmønster for å søke etter)
  • Himmelen (erstatningstreng)

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.


Real World Application

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 strengen Nåværende forhold: eller C (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.txt

du ville få

En tiger våkner i sumpen Wimoweh, wimoweh, wimoweh, wimoweh

fordi 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 C

Men 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 flere sed kommandoer. Derfor erstatter vi først strengen "Gjeldende betingelser:" med ingenting, etterfulgt av erstatning
med 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? Forfatterens C grepsøk ville mislykkes). Men eksemplet tjente en hensikt - og det var å introdusere deg til den fantastiske verden av grep og sed.


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.

  • Sed guide
  • Begynners guide til grep
  • Praktiske Unix Grep Command Eksempler
  • Grep dokumentasjon ved IBM
  • Curl dokumentasjon
  • Vanlig uttrykk

Konklusjon

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.