Læring GNU Text Utilities

For noen uker siden så vi på noen av GNU verktøy som du kan bruke til å arbeide med filer, sjekk MD5 /SHA1 summer og sjekke diskbruk. Denne gangen ønsker jeg å dekke noen av de verktøy som du vil bruke for å arbeide med tekstfiler.

Hvorfor tekstfiler, spesielt? Vel, hvis du gjør mye arbeid i skallet på Linux, vil du begynne å møte en masse tekst eller filer som kan oppføre seg som tekst. Loggfiler, konfigurasjonsfiler og utgang fra mange kommandoer kan alle manipuleres med GNU textutils.

På et tidspunkt ble GNU textutils brutt ut i sin egen pakke, men for noen år siden ble de fusjonert inn i GNU coreutils. Men for enkelhets skyld, kommer jeg til å beholde den gamle slagordet fordi det er en praktisk måte å tenke om disse verktøyene.

Antar du kjører noen av de store Linux distroer og har en standard installasjon, bør du har GNU coreutils pakken installert allerede. Noen minimalistisk Linux distroer skip Busybox stedet. Hvis det er tilfelle, kan du ha noen versjoner av de verktøy vi diskuterer her er installert, men de kan ikke ha alle de samme mulighetene som GNU textutils. Både Busybox og GNU textutils er faktisk implementeringer av verktøy som opprinnelig ble utviklet for proprietære UNIX.

Noen av verktøyene er mer nyttige enn andre i dag, så jeg kommer til å fokusere på de verktøyene som er mest sannsynlig å være nyttig for deg. For eksempel er den base64 verktøy for å konvertere inn /ut av base64 ikke noe jeg har hatt noen oppfordring til bruk i løpet av de siste 10 årene. Men FMT, nl og uniq fortsatt være nyttig på en jevnlig basis.

Noen få har blitt dekket i forrige GNU opplæringen også. Spesielt md5sum, hode og hale, så kan du gå tilbake og sjekke Bli gno GNU Utilities tutorial hvis du trenger å friske opp disse.

Forståelse katt og tac

Katten verktøyet er kort for ". sette sammen " Jeg tror vi alle er enige om at det var lurt å trimme som en ned litt. OK, men hva betyr det? I utgangspunktet vil katten ta en fil eller standard input og sende det til standard ut. Hvis du ikke omdirigere utdataene fra katten vil den skrive til terminalen, eller du kan bruke en av de omadresserere og sende utdata til en fil eller en annen nytte.

Du kan også bruke katten til å bli med filer å arbeide med dem sammen. For eksempel, hvis du ønsker å behandle et par loggfiler på en gang, kan du bruke noe sånt som:


 cat filnavn1 filnavn2 | sort 

tac kommandoen er i utgangspunktet bare katt bakover. Dette kan være nyttig hvis du ønsker å behandle en loggfil fra de nyeste oppføringene til den eldste.

Noen purister vil merke at katten er overbrukes når enkel fil omdirigering ville gjøre. For eksempel, vil du ofte se noe sånt som dette:


 cat filnavn | sort 

Hva er det som skjer der er å bruke katten til rør (|) for å sortere. Egentlig kan du gjøre det samme ved å kjøre sort < navn og spare deg selv litt av å skrive. Men gjøre hva som fungerer best for deg.

Formatering filer

Mange av textutils er dedikert til formatering av tekst for utskrift. Noen folk har å gjøre med linjeskrivere og bruke CLI verktøy for å sende til skrivere i disse dager (men ikke et foreldet kunst, for å være sikker), men du kan fortsatt finne disse verktøyene er nyttige i mange situasjoner.

FMT kommandoen vil formatere tekst for å skrive til standard ut eller en annen fil. Dette er først og fremst brukes til å tilpasse flyten i teksten til en standard kolonnebredde. Si at du ønsker å fylle en tekstfil slik at hver linje er bare 72 tegn: Du kan gjøre dette enkelt med FMT som så:


 FMT -w72 filnavn.txt 

Dette vil bare bryte linjene på blanke tegn: det vil ikke bryte en hel setning (ord eller andre ubrutte sett tegn) med mindre det er lengre enn 72 tegn

kuttet verktøyet vil fjerne deler fra en fil.. Så hvis du ønsker å forholde seg til bare en del av en loggfil, for eksempel, kan du bruke klipp verktøyet til å hogge ut bare de biter som du ønsker å arbeide med. Kuttet verktøyet fungerer på hver linje. Så, gitt innspill som dette:


 [Sun Mar 21 16:36:21 2010] [error] [klient 69.72.214.138] Fil eksisterer ikke: /var /www /komponenter [Sun 21 mars 17:24:42 2010] [error] [klient 78.110.50.111] Fil eksisterer ikke: /var /www /joomla [Sun 21 mars 17:37:15 2010] [error] [klient 174.36.241.157 ] script '/var/www/index.php' ikke funnet eller ute av stand til å stat [Sun 21 mars 18:06:59 2010] [error] [klient 38.111.147.83] filen finnes ikke: /var /www /roboter. txt 

... du kan bruke klipp for å skille enkeltfelt. Så hvis du bare ønsker å jobbe med, si, IP-adressen eller feilmeldingen, kan du bruke klipp.

Trenger du å trimme en fil ved linjer i stedet? Splitten verktøyet vil ta en loggfil eller annen tekstfil og utgang til mindre filer. Standard er å ta innspill og spytte ut filer av 1000 linjer hver. Mindre dette er spesifisert, vil filene bli kalt " XAA, " &Quot; xab " og så videre til delt ferdig filen eller går ut av suffikser.

Hvorfor skulle du ønske å gjøre dette? En grunn er å gjøre det enklere å jobbe med loggfiler, bryte dem ned i mindre biter for arkivering eller foredling.

Finne Unike Oppføringer med uniq

Når du vasser gjennom loggfiler eller behandlingen andre tekstfiler, vil du ofte har filer med en rekke lignende oppføringer. Hvis du ønsker å renske dem ned til unike oppføringer, er uniq verktøyet for å strekke seg etter. La oss starte med et enkelt eksempel, som en tekstfil på 1000 e-postadresser. Du vet du har duplikater, men føler ikke at sortering gjennom filen for hånd, og sannsynligvis ikke ville få øye på alle duplikater likevel. Ikke noe problem; bare filtrere listen med Uniq:


 uniq < emails.txt 

uniq verktøyet vil utelate duplikater. Hvis du ønsker å se hvor mange ganger du har dupliserte linjer, bruker -c alternativet for å telle antall ganger en linje vises.

Men vent. Du legger merke til at enkelte linjer kan være duplikater tross alt! Det er fordi uniq ser for to (eller flere) linjer sammen. Hvis du har dupliserte linjer som er separat oppført, vil de bli savnet. Med mindre du kombinerer uniq med en annen GNU textutil. Sort

sortere det ut med sort

Den slags nytte gjør akkurat det du forventer: Det tar innspill og sorterer det i henhold til kriteriene du gi det. Standard er å sortere etter og quot; ordboken " rekkefølge, men det kan også sortere etter numerisk verdi, i omvendt rekkefølge, etc. Se man-siden for hele spekteret av alternativer, men være trygg hvis det er en måte du vil sortere en fil alternativet finnes sannsynligvis.
< p> Her er hvordan vi ville kombinere form og uniq å bli kvitt de pesky duplikater:


 slags emails.txt | uniq > sorted_emails.txt 

Ganske enkelt, ikke sant? Du bare rør utdata fra sort til Uniq. Ved kjeding kommandoene, kan vi begynne å gjøre noen virkelig nyttig arbeid.

sette dem sammen

Individuelt, de textutils er nyttige, men du kanskje lurer på hva big deal er. Du kan ikke gjøre mye med katt eller uniq individuelt. Men når du begynner å kjeding kommandoene, kan du gjøre noen ganske kraftige saker.

La oss si at du ønsker en rapport over alle de unike IP-adresser som har dukket opp i en loggfil i den siste dag eller så. Vi kommer til å bruke klipp, sortere og uniq å få alle de unike IP-adresser. Som en ekstra bonus, vil vi kaste i nl, et verktøy som vil telle linjer for deg:


 kutte -d '' -f 8 error.log | sort -n | uniq | nl 

Dette tar filen error.log
, og kjører den gjennom kuttet først. Alternativene til å kutte fortelle verktøyet å bruke mellomromstegnet som skilletegn (d '') og for å bare spytte ut den 8. feltet (-f 8) fra filen. Så hvis du ser på filen, IP-adressen er den åttende feltet hvis du teller feltene separert (avgrenset) med mellomrom.

Så det går som gjennom slag for å sortere IP-adressene numerisk (-n). Deretter fjerner det dupliserte IP-adresser. Endelig går det resultatet via nl å gi en telling

Det vil produsere et resultat som dette:.


 1 4.20.98.115] 2 4.79.205.35] 3 12.10 .235.174] 4 12.102.9.44] 5 12.106.89.75] 6 12.111.52.254] 7 12.111.74.5] 8 12.132.106.130] 9 12.14.59.66] 10 12.149.50.2] 

Bra, men ikke bra ennå. Jeg liker ikke den etterfølgende braketten. Så la oss kaste i en bonus verktøy, sed, som er en strøm redaktør:


 kutte -d '' -f 8 error.log | sort -n | uniq | sed s /'] //| nl 

Nå vil du få samme resultat, men uten den irriterende endebraketten. SED kommandoen bruker bare en søk og erstatt. Hvis du har fulgt Vim 101 nybegynner guide for noen måneder siden, som skal se kjent. Den s /starter søket, og deretter ']' forteller sed å lete etter en avsluttende parentes. Hvorfor gjorde jeg bruke apostrof? Fordi Bash skallet behandler] som et spesialtegn. Å sette det i enkle anførselstegn forteller skallet til å behandle det bokstavelig (dvs. ikke å tolke det). Endelig //den avslutt fortelle sed å erstatte braketten med ingenting.

Igjen, dette egentlig bare skraper i overflaten av hva GNU utils kan gjøre. Men jeg håper det har gitt deg en røff guide til hvordan du kan bruke GNU textutils og hvordan de kan være nyttig for deg. I fremtidige tutorials, vil vi ta en titt i mer dybde på sed hvis det er interesse, la meg beskjed i kommentarfeltet! I mellomtiden, ta litt tid å bli kjent med GNU verktøy. Du vil finne at det er meget vel verdt det!