Hvordan bruke Awk finne og sortere tekst i Linux, er GnuCash

awk en fantastisk Unix skriptspråk for behandling tekstfiler. Versjonen inkludert i de fleste Linux distroer er GNU awk, eller glaner for kort. Jeg liker det for å trekke data fra bestilt datasett, for eksempel tekstlister og CSV eksport fra regneark. awk ser hver linje i en fil som en egen post, og hvert element i en linje som et eget felt, som gjør det mulig å dele opp filene dine i alle slags fleksible måter. Den klassiske måten å illustrere dette er med /etc /passwd; dette eksempelet skriver hele innholdet:

 $ awk '{print $ 0} /etc /passwd root:x:0:0:root:/root:/bin/bashdaemon:x:1:1:daemon:/usr/sbin:/bin/shbin:x:2:2:bin:/bin:/bin/shsys:x:3:3:sys:/dev:/bin/sh

print med ingen alternativer betyr "skrive ut hele linjen", og $ 0 betyr "hel line", så å utelate $ 0 gir samme resultat. Nå antar du vil bare ha en liste med brukernavn og UIDs: /etc /passwd er perfekt for parsing med awk, fordi dens datafelt er avgrenset med kolon. Så alle gjør du er telle fra venstre starter med en til nummer feltene du ønsker, og deretter trekke ut brukernavn og UIDs som dette:

 $ awk -F ":" '{print $ 1 "" $ 3} '/etc /passwd root 0daemon 1bin 2sys 3 

-F definerer ditt felt separator, og "" legger inn et mellomrom. Hva om du vil at UIDs oppført først? Easy peasey, bare flytte variablene rundt som dette:

 $ awk -F ":" '{print $ 3 "« $ 1} /etc /passwd 

La oss nå se på en real-life eksempel på bruker awk å migrere en stor klump av finansielle data i GNUcash.

Importere data inn GnuCash

GnuCash er en av kronjuvelene av FOSS, en strålende og kraftig regnskap program som kjører på Linux, Mac og Windows. Du kan importere QIF og OFX-filer, men det er bare delvis støtte for CSV import. Som er en skam, fordi CSV (kommadelte verdier) gjør en god universell format for flytting økonomiske data fra ett program til et annet, og mange finansielle applikasjoner støtter CSV import og eksport.

La oss si at du har denne giganten regneark som inneholder år med økonomiske data, og du bestemmer deg for det er på tide å sette den på en skikkelig regnskap programmet. Eller du ønsker å flytte fra et annet regnskap programmet inn GNUcash, og den støtter ikke QIF eller OFX, men den støtter CSV eksport. Du kan skrive inn alle dine data, eller du kan sette ditt ess Linux skripting ferdigheter til å fungere. Arbeidsflyten er å først lage en god ren CSV-fil, konvertere det til QIF, og deretter importere QIF inn GnuCash. GnuCash er veldig kresen når det gjelder å ha et helt rent QIF fil uten feil, så vi skal sørge for å ha det.

Pass på at du jobber fra en kopi av kildefilen! Ikke muck opp originalen

Jeg vil holde dette eksempelet enkle og bruke bare følgende QIF felt:

D - dato

P - betalingsmottaker

M - memo

T - Mengden

N - sjekk nummer, eller noen notasjon i sjekknummeret feltet

L - kategori, noe som tilsvarer GNUcash står

^ - end of record

Vi må også oppgi kontotype i QIF filhodet, som disse eksemplene:

 Type : Type Bank:! Cash Type: ccard Type: Invst 

QIF spesifikasjonen støtter mange flere elementer, og du kan se alle detaljene her. Hvis denne siden noen gang forsvinner bare gjøre et søk etter "QIF spec" som det er rikelig dokumentert.

Regneark er fab for å gjøre masse endringer, som dato og tallformater, så ta en titt på din CSV i et regneark før du prøver å konvertere den til QIF. Sørg for at dine uttak har et minustegn, som -33,72, og ikke bruke dollartegn. Innskudd kan ha et plusstegn hvis du foretrekker det, men det er ikke nødvendig. Alle dine uttak og innskudd må være i en enkelt kolonne. Dette er hva min endelig trimmet ned CSV eksport ser slik ut:

 11/03/2008 Kopier Junction Kopi av byggeforskrifter -33.72 8732 Supplies 11/03/2008 Home Depot murskje -17.05 8734 Tools 11/03 /2 008 Dewalt servicesenter lader for Drill -75.85 8735 Tools 11/04/2008 Building Forsyning Margin sparkel -13.23 8736 Tools 11/05/2008 Jane Smith faktura # 5843 8,500.00 dep inntekt: kontrahering 

Hvis det er enda en enkelt feil hvor som helst i QIF filen GnuCash import vil mislykkes. Noen feil jeg har kjørt inn er flere minustegnene, som --33.72, ekstra desimaler, og feil dato formatering. awk vil ikke bry seg, men GnuCash vil. Alrighty da, la oss konvertere vår hyggelige CSV inn i en QIF fil:

$ (echo 'Type: Bank!'; Cat exportfile.csv | awk -F $ '\\ t' '{print "D" $ 1; print "P" $ 2; print "M" $ 3; print "T" $ 4; print "N" $ 5; print "L" $ 6; print "^";}) > importfile.qif

Og resultatet ser slik ut, med uttak indikert ved minustegnene og innskudd med usignerte verdier:

 Type: BankD03 /25 /2008PJane SmithM faktura # 4657T4000.00NdepLincome: entreprenør ^ D04 /02 /2008PFirst Bank of MoneyMCheck ordert-21.44NACHLbank avgifter ^ D05 /15 /2008PPretty DesignsMDesign ServicesT-500.00N8922LContract Services ^ 

Legg merke til hvordan du angir en fane feltet skilletegn ved å bruke normal ASCII escape-sekvens for horisontale faner, \\ t. Hvis alt går bra vil du ha en god feilfrie QIF fil å importere til GnuCash. Du kan importere dette inn i en blank ny GNUcash bok, eller en eksisterende bok, og du vil kartlegge QIF kategorier for å GNUcash kontoer.

Finn tekstblokker

awk er fantastisk for å finne blokker med tekst, og du kan gi det et forsøk når grep ikke er å plukke opp akkurat det du ønsker. For eksempel kan du snag hele lspci utgang for en enkelt enhet:

 $ lspci -v | awk '/VGA/,/^$/'01:00.0 VGA-kompatibel kontroller: NVIDIA Corporation G98 [GeForce 8400 GS] (rev a1) (prog-hvis 00 [VGA controller]) Subsystem: Micro-Star International Co., Ltd . Enhets 1162 Flags: Bus Master, rask devsel, ventetid 0, IRQ 18 Memory på fd000000 (32-bit, non-prefetchable) [size = 16M] Memory på d0000000 (64-bit, prefetchable) [size = 256M] Memory på fa000000 (64-bit, non-prefetchable) [size = 32M] I /O-porter på dc00 [size = 128] [virtuell] Expansion ROM på fe9e0000 [funksjonshemmede] [size = 128K] Capabilities: Kernel driver i bruk: nvidia Kernel moduler: nvidia_current, nouveau, nvidiafb 

cirkumflekstegnet, ^, er et vanlig uttrykk anker som matcher starten på en snor, og $ kamper på slutten, så i dette eksempelet /^ $ /ser for linjeskiftene i begynnelsen og slutten av tekstblokken. Dette er et flott triks for å trekke ut spesifikke kvartaler fra store konfigurasjonsfiler med mellomrom mellom avsnittene, som dette eksemplet fra sshd_config:

 $ awk '/X11Forwarding /, /^ $ /' /etc /ssh /sshd_config X11Forwarding yesX11DisplayOffset 10PrintMotd noPrintLastLog yesTCPKeepAlive ja # UseLogin ingen 
Fjern duplikater uten sortering

Sorterings og uniq kommandoer er de vi vanligvis slå til for å finne og fjerne dupliserte oppføringer i en fil. Men kanskje du ikke vil at kildefilen sortert eller endret, så dette er hvor trofaste awk kommer til unnsetning ved å trekke ut de unike poster og lagre dem i en ny fil:

 $ awk 'x [$ 0 ] ++ 'filewithdupes > newfile 

Din opprinnelige filen vil ikke bli endret, og den nye filen vil bare ha unike oppføringer alle pent i rekkefølge.

man awk inneholder fullstendig dokumentasjon av alternativer, og å få mest mulig ut av awk ( eller Unix /Linux-kommandoen) du trenger en god forståelse av regulære uttrykk, og for dette vil jeg anbefale den fantastiske boken Maste regulære uttrykk. Hvis du ønsker å velge den mest nyttige ting for alle å lære, lære regulære uttrykk, fordi de fleste programmeringsspråk og Linux /Unix-kommandoer er avhengige av regulære uttrykk. Anmeldelser