- Skann filene, linje for linje.
- Del hver linje i felt / kolonner.
- Spesifiser mønstre og sammenlign linjene i filen med disse mønstrene
- Utfør forskjellige handlinger på linjene som samsvarer med et gitt mønster
I denne artikkelen vil vi forklare den grunnleggende bruken av awk-kommandoen og hvordan den kan brukes til å dele en fil med strenger. Vi har utført eksemplene fra denne artikkelen på et Debian 10 Buster-system, men de kan enkelt replikeres på de fleste Linux-distribusjoner.
Eksempelfilen vi skal bruke
Eksempelfilen til strengene vi skal bruke for å demonstrere bruken av awk-kommandoen er som følger:
Dette er hva hver kolonne i eksempelfilen indikerer:
- Den første kolonnen inneholder navnet på ansatte / lærere på en skole
- Den andre kolonnen inneholder emnet som den ansatte underviser i
- Den tredje kolonnen angir om den ansatte er professor eller assisterende professor
- Den fjerde kolonnen inneholder lønnen til den ansatte
Eksempel 1: Bruk Awk til å skrive ut alle linjene i en fil
Utskrift av hver linje i en spesifisert fil er standard oppførsel for awk-kommandoen. I den følgende syntaksen for awk-kommandoen spesifiserer vi ikke noe mønster som awk skal skrive ut, og derfor skal kommandoen bruke "print" -handlingen på alle linjene i filen.
Syntaks:
$ awk 'print' filnavn.tekstEksempel:
I dette eksemplet ber jeg awk-kommandoen om å skrive ut innholdet i eksempelfilen min, linje for linje.
$ awk 'print' sample_file.tekst
Eksempel 2: Bruk awk til å skrive ut bare linjene som samsvarer med et gitt mønster
Med awk kan du spesifisere et mønster, og kommandoen vil bare skrive ut linjene som samsvarer med det mønsteret.
Syntaks:
$ awk '/ pattern_to_be_matched / print' filnavn.tekstEksempel:
Fra eksempelfilen, hvis jeg bare vil skrive ut linjen (e) som inneholder variabelen 'B', kan jeg bruke følgende kommando:
$ awk '/ B / print' sample_file.tekst
For å gjøre eksemplet mer meningsfylt, la meg bare skrive ut informasjonen om ansatte som er 'professor'.
$ awk '/ professor / print' sample_file.tekst
Kommandoen skriver bare ut linjene / oppføringene som inneholder strengen "professor", slik at vi har mer verdifull informasjon hentet fra dataene.
Eksempel 3. Bruk awk til å dele filen slik at bare spesifikke felt / kolonner skrives ut
I stedet for å skrive ut hele filen, kan du gjøre det vanskelig å skrive ut bare bestemte kolonner i filen. Awk behandler alle ord, atskilt med mellomrom, i en linje som en kolonneoppføring som standard. Den lagrer posten i en $ N-variabel. Der $ 1 representerer det første ordet, lagrer $ 2 det andre ordet, $ 3 det fjerde, og så videre. $ 0 lagrer hele linjen slik at hvem-linjen skrives ut, som forklart i eksempel 1.
Syntaks:
$ awk 'skriv ut $ N, .. .' filnavn.tekstEksempel:
Følgende kommando vil bare skrive ut den første kolonnen (navn) og den andre kolonnen (emne) i eksempelfilen min:
$ awk 'print $ 1, $ 2' sample_file.tekst
Eksempel 4: Bruk Awk til å telle og skrive ut antall linjer som et mønster samsvarer med
Du kan fortelle awk å telle antall linjer som et spesifisert mønster samsvarer med, og deretter sende det 'count'.
Syntaks:
$ awk '/ pattern_to_be_matched / ++ cnt END print "Count =", cnt'filnavn.tekst
Eksempel:
I dette eksemplet vil jeg telle antall personer som underviser i faget "engelsk". Derfor vil jeg be awk-kommandoen om å matche mønsteret "engelsk" og skrive ut antall linjer som dette mønsteret samsvarer med.
$ awk '/ engelsk / ++ cnt END print "Count =", cnt' sample_file.tekst
Tellingen her antyder at to personer underviser i engelsk fra eksempelfilene.
Eksempel 5: Bruk awk til å skrive ut bare linjer med mer enn et spesifikt antall tegn
For denne oppgaven vil vi bruke den innebygde awk-funksjonen kalt "lengde". Denne funksjonen returnerer lengden på inngangsstrengen. Dermed, hvis vi vil ha det vanskelig å skrive ut linjer med mer enn, eller til og med mindre enn, antall tegn, kan vi bruke lengdefunksjonen på følgende måte:
For utskrift av linjer med tegn som er større enn et tall:
$ awk 'lengde ($ 0)> n' filnavn.tekstFor å skrive ut linjer med tegn mindre enn et tall:
$ awk-lengde ($ 0) < n' filename.txtHvor n er antall tegn du vil spesifisere for en linje.
Eksempel:
Følgende kommando vil bare skrive ut linjene fra eksempelfilen min som har mer enn 30 tegn:
$ awk 'lengde ($ 0)> 30' sample_file.tekst
Eksempel 6: Bruk awk for å lagre kommandoutgangen i en annen fil
Ved å bruke omdirigeringsoperatøren '>' kan du bruke awk-kommandoen til å skrive ut utdataene til en annen fil. Slik kan du bruke den:
$ awk 'criteria_to_print "filnavn.txt> utdatafil.tekstEksempel:
I dette eksemplet vil jeg bruke viderekoblingsoperatøren med min awk-kommando for å skrive ut bare navnene på de ansatte (kolonne 1) til en ny fil:
$ awk 'print $ 1' sample_file.txt> ansatt_navn.tekst
Jeg bekreftet gjennom kattkommandoene at den nye filen bare inneholder navnene på de ansatte.
Eksempel 7: Bruk awk til å skrive ut bare ikke-tomme linjer fra en fil
Awk har noen innebygde kommandoer som du kan bruke til å filtrere utdataene. For eksempel brukes NF-kommandoen til å holde en telling av feltene innenfor gjeldende inngangspost. Her vil vi bruke NF-kommandoen til å skrive ut bare de ikke-tomme linjene i filen:
$ awk 'NF> 0' sample_file.tekstÅpenbart kan du bruke følgende kommando til å skrive ut de tomme linjene:
$ awk 'NF < 0' sample_file.txtEksempel 8: Bruk awk til å telle de totale linjene i en fil
En annen innebygd funksjon kalt NR teller antall inngangsposter (vanligvis linjer) for en gitt fil. Du kan bruke denne funksjonen i awk som følger for å telle antall linjer i en fil:
$ awk 'END print NR' sample_file.tekst
Dette var den grunnleggende informasjonen du trenger for å starte med å dele filer med kommandoen awk. Du kan bruke kombinasjonen av disse eksemplene for å hente mer meningsfull informasjon fra filen din med strengene gjennom awk.