Linux-opdrachten en shell-vaardigheden
awk: Wanneer kolommen programma's worden
awk is waar u naar reikt als kolommen de werkeenheid worden: nginx-toegangslogboeken, /etc/passwd, df-uitvoer, alles dat in velden leeft. Het is een complete taal (variabelen, arrays, rekenkunde, patroon-actieregels) in oneliner-kleding, wat precies de juiste vermomming is voor logforensisch onderzoek. De eerlijke grens: alles wat awk comfortabel doet, is een oneliner, en alles wat een pagina met blokken nodig heeft, is een Python-script dat zichzelf nog niet heeft toegegeven.
Kernpunten
- Het splitsen van velden is de kerntruc: awk -F: '$3 >= 1000 {print $1}' /etc/passwd geeft de echte gebruikers weer, en -F'[,|]' verwerkt scheidingstekens van meerdere tekens wanneer het knippen al is opgegeven.
- Tellen met associatieve arrays: awk '{count[$1]++} END {for (c in count) print count[c], c}' /var/log/secure verandert elk logboek in een frequentietabel op één regel.
- NR en NF beantwoorden bestandsvragen: 'NR==1' is de kopregel, '{print NF}' telt kolommen per rij, en het vergelijken van NR met de opgeslagen waarden van een ander bestand vindt duplicaten en gaten.
- Match plus extract is het dagelijkse brood: awk '/ 500 / {print $7, $9}' access.log haalt foutpagina's met URL's op, en met OFS kun je $0 opnieuw afdrukken nadat je een enkel veld hebt bewerkt zonder de regel zelf te herschrijven.
- BEGIN- en END-blokken zijn waar de totale werklevens worden verzameld: BEGIN stelt scheidingstekens in, de middelste regels lopen per regel, END drukt de totalen af; drie blokken lezen prima, vijf is een script in vermomming.
- Citeren is de echte vijand van shell-oneliners: enkele quotes van het programma, dubbele letterlijke aanhalingstekens erin, en onthoud dat $7 in een shell-string met dubbele aanhalingstekens nooit awk bereikt.
- Numeriek werk levert LC_ALL=C op: locale komma's in cijfers en oneven sorteringen draaien vergelijkingen en sorteringen zijwaarts, en het vastzetten van de locale is één regel die een middag bespaart.
- Ken het plafond: komma's tussen aanhalingstekens in CSV, geneste JSON of stateful meerregelige formaten gaan naar Python; awk is een scalpel en blijft er een.
Notitie uit de praktijk
Een vreemde oneliner die dollarkolommen uit een logboek optelde met locale komma's, leverde getallen op waar niemand aan twijfelde totdat de boekhouding het rapport opende. LC_ALL=C verhuisde die week naar onze aliasbibliotheek en bleef daar.
Veelgestelde vragen
awk of cut voor kolomwerk?
geknipt voor één vast scheidingsteken en een gewone kolomlijst; awk op het moment dat voorwaarden, regex, rekenkunde of aggregaten verschijnen, op welk punt de snede sowieso uit de diepte is.
Hoe kan ik een kolom optellen of middelen?
Aggregeren in END: awk '{s += $5} END {print s, s/NR}' telt veld vijf op en gemiddeld over de regels; verwijder scheidingstekens voor duizendtallen eerst als een landinstelling komma's in de cijfers plaatst.
Waarom gedraagt mijn gekke oneliner zich anders op macOS?
macOS verzendt een POSIX awk zonder GNU-extensies zoals -i inplace of gensub; scripts die op Linux draaien kunnen daar stilletjes mislukken, dus houd oneliners in de POSIX-vorm of draag gawk met je mee.
Kan JSON ontleden?
Niet betekenisvol: JSON heeft geen kolomstructuur die awk begrijpt en regex-hacks breken op geneste objecten. Gebruik jq, de vorm van awk voor JSON, of de json-module van Python wanneer de taak groeit.
Hoe Kinetikatech helpt bij linux-opdrachten en shell-vaardigheden
Dit is ons dagelijks werk: De opdrachten en scriptgewoonten die beslissen of een beheerder een server beheert of bestrijdt: tekst en processen zoeken, transformeren, overdragen en controleren met de tools die in elke basisinstallatie aanwezig zijn. Onze dienst Linux-serverbeveiliging en Serverbeheer dekt het volledige traject: beoordeling, implementatie, 24/7-monitoring en noodrespons binnen 30 minuten.