Portál AbcLinuxu, 29. března 2024 05:52

Unixové nástroje – 21 (awk)

10. 2. 2011 | David Watzke
Články - Unixové nástroje – 21 (awk)  

V dalším díle Unixových nástrojů se podíváme na jeden z důležitých konzolových nástrojů pro práci s textem: AWK.

AWK je programovací jazyk a zároveň tradiční *nixový nástroj (awk) sloužící ke zpracování textových proudů. Název vznikl složením prvních písmen příjmení třech hlavních autorů AWKu: Alfred V. Aho, Peter J. Weinberger a Brian W. Kernighan.

# jak na "Hello, world!" a komentář v AWKu...
BEGIN { print "Hello, world!" }

AWK je poněkud více těžkotonážní než grep, sed, cut a podobné nástroje. Používáte-li tedy ke zpracování textu kombinaci těchto nástrojů a ještě awk navrch, tak vězte, že v rámci optimalizace by takový příkaz bylo velmi pravděpodobně možné přepsat pouze do AWKu. Následující dva příkazy docílí stejného výsledku:

$ dmesg | grep CPU0 | cut -d' ' -f2
AMD

$ dmesg | awk '/CPU0/ { print $2 }'
AMD

Toto bylo jedno z nejtriviálnějších použití AWKu. Trochu jej rozebereme. Předpis /regexp/ { příkazy } provede příkazy na ty řádky textu, které odpovídají danému regulárnímu výrazu. A co dělá print $2? Vypíše druhý sloupec právě zpracovávaného řádku. Oddělovačem sloupců (či polí) je ve výchozím nastavení mezera a tabulátor, ale pomocí proměnné FS (field separator) toto můžete změnit. Další zvláštní proměnnou je RS (record separator), pomocí které lze nastavit oddělovač jednotlivých řádků (či záznamů). Výchozí hodnotou je '\n', tedy znak nového řádku. Další užitečné proměnné jsou NR (number of records) a NF (number of fields), přičemž první drží pořadové číslo právě zpracovávaného řádku a druhá počet sloupců tohoto řádku.

Další důležitou součástí jazyka jsou speciální bloky BEGIN { ... } a END { ... }. První se vykoná jednou, hned po spuštění, ještě než se začne zpracovávat text a druhý pro změnu až na konci, když je text zpracován. Pro ilustraci uvedu příklad využívající těchto možností:

$ find . -name *.ebuild
./media-video/subtitlecomposer/subtitlecomposer-0.5.3_p20100510.ebuild
./app-misc/lc/lc-1.0.3-r1.ebuild
./app-i18n/man-pages-cs/man-pages-cs-0.18.20090209.ebuild
./app-office/eqonomize/eqonomize-0.6.ebuild

$ find . -name '*.ebuild' -print0 | awk 'BEGIN { RS="\0"; FS="/" } { print NR ": " $4 }'
1: subtitlecomposer-0.5.3_p20100510.ebuild
2: lc-1.0.3-r1.ebuild
3: man-pages-cs-0.18.20090209.ebuild
4: eqonomize-0.6.ebuild

V této ukázce jsem si programem find nechal vypsat názvy souborů s příponou ".ebuild" v aktuálním adresáři. Názvy jednotlivých souborů jsou díky (nestandardnímu) přepínači -print0 oddělené znakem "\0" místo "\n", což se může hodit tehdy, když očekáváme exoticky pojmenované soubory, které mají třeba znak "\n" v názvu. V AWKu v sekci BEGIN nastavíme proměnnou RS tak, aby se počítalo se zvláštním oddělováním řádků. Nastavíme také proměnnou FS na lomítko, takže jednotlivé prvky cest k souborům budou obsaženy ve speciálních proměnných $1, $2, atd. Poté v hlavním bloku budeme vypisovat čísla řádků a za ně dvojtečku a čtvrtý sloupec, což můžou být názvy samotných ebuildů. Jak vidíte, řetězce lze spojovat bez speciálních operátorů, dokonce i mnou uvedené mezery jsou tam jen pro přehlednost.

AWK má dostupné různé matematické funkce, jako třeba cos(), sin(), exp(), log(), sqrt(). Fungují i standardní operátory +, -, * a /. Kromě toho má AWK ještě několik předdefinovaných funkcí pro práci s řetězci, z nichž některé si také předvedeme. A pokud vám v AWKu nějaká funkce chybí, můžete si ji sami definovat. Uživatelsky definované funkce, stejně jako ty vestavěné, mohou vracet hodnoty (pomocí příkazu return).

Mezi základní funkce pro práci s řetězci patří length() pro zjištění délky řetězce, sub() pro nahrazení textu v řetězci, split() pro rozdělení řetězce dle daného oddělovače do daného pole, sprintf() pro formátování výstupu a tolower() a toupper() pro změnu velikosti písmen na všechna malá či velká.

Toto je asi vhodná chvíle pro představení přepínače -f, kterému lze jako argument předat cesta k souboru s programem v AWKu. U delších programů z pochopitelných důvodů přestává být praktické psát je celé do příkazového řádku. Následuje o trochu složitější příklad:

BEGIN { x = 0 }

{
	if ( NF == 2 ) {
		print toupper($2) ", " toupper(substr($1, 1, 1)) tolower(substr($1, 2))
	} else {
		x++
	}
}

END {
	if ( x > 0 ) print sprintf("Nektere zaznamy (%d) byly preskoceny...", x)
}

Tento program zkontroluje, zda řádky obsahují dvě slova a pokud ano, vypíše je ve formátu "SLOVO2, Slovo1". Pokud soubor obsahuje jeden či více řádků, které nemají dvě slova, tak program na konci vypíše hlášení s počtem takovýchto řádků. Máme-li vstupní soubor jmena.txt s následujícím obsahem:

david watzke
LUBOŠ Doležel
a někdo další

a zároveň máme výše uvedený program uložený v textovém souboru s názvem program.awk, tak docílíme následujícího:

$ awk -f program.awk < jmena.txt
WATZKE, David
DOLEŽEL, Luboš
Nektere zaznamy (1) byly preskoceny...

Na této ukázce jsem odhalil, že awk umí pracovat s podmínkami if, ale zrovna tak nemá problém s cykly a spoustou dalších věcí. Rozsah podporovaných vychytávek se liší mezi různými implementacemi. Původní AWK byl totiž rozšířen a vznikl tak nawk (zkratka new awk, tj. nový awk) a kromě toho je zde také velmi rozšířený gawk, neboli GNU awk.

Jelikož cílem článku evidentně není naučit vás AWK kompletně, ale pouze naznačit, k čemu jej lze použít, tak další studium jeho možností nechám na vás. V diskuzi se můžete podělit s ostatními o své zkušenosti.

Seriál Unixové nástroje (dílů: 27)

První díl: Unixové nástroje – 1 (úvod, cat, head, tail), poslední díl: Unixové nástroje – 26 (triky pro práci v Bashi).
Předchozí díl: Unixové nástroje – 20 (id, who, tty, uname)
Následující díl: Unixové nástroje – 22 (taskset, ionice, chrt)

Další články z této rubriky

VDR a DVB-T2, část 2.
VDR a DVB-T2, část 1.
Šifrovaný Proxmox VE 6: ZFS, LUKS, systemd_boot a Dropbear
MapTiler – proměňte obrázek v zoomovatelnou mapu
Syncthing

Diskuse k tomuto článku

pavlix avatar 10.2.2011 00:12 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Odpovědět | Sbalit | Link | Blokovat | Admin
vězte, že v rámci optimalizace by takový příkaz bylo velmi pravděpodobně možné přepsat pouze do AWKu.
A kdyby to stále ještě dřelo, tak perl to zachrání :).
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
10.2.2011 03:55 ____ | skóre: 15 | blog: _
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
AWK je verzatilní dost. :) Nejlepší je asi GNU AWK varianta.
10.2.2011 10:27 mimi.vx | skóre: 37 | blog: Mimi.VX | Praha
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)

přece jen perl byl vytvořen jako náhraa AWKu ...

USE="-gnome -kde";turris
David Watzke avatar 10.2.2011 10:31 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Perl je daleko univerzálnější (a větší) než AWK. Pro začátek si představ třeba GUI v AWKu :-) Perl je sice inspirovanej AWKem (v některých směrech), ale není to jen nástroj pro zpracování textu. Jasně, i s AWKem lze provádět ledacos, ale nedá se to srovnávat.
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
10.2.2011 22:31 Pev | skóre: 28
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Ano. Kdysi jsem se snažil používat pro zpracování textu awk, ale pak jsem dal přednost perlu (znalosti perlu se hodí i jinde; syntaxe obou jazyků je zvláštní, ale perl mi prostě vyhovuje víc). Díky za článek.
pavlix avatar 13.2.2011 11:06 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Ano. Kdysi jsem se snažil používat pro zpracování textu awk, ale pak jsem dal přednost perlu (znalosti perlu se hodí i jinde; syntaxe obou jazyků je zvláštní, ale perl mi prostě vyhovuje víc). Díky za článek.
Právě přecházím :).
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
pavlix avatar 13.2.2011 11:05 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
To máš samozřejmě pravdu. Nicméně s perlem ztrácím jakýkoli důvod používat awk a zvlášťě pak na sebe roubovat awk a sed.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
13.2.2011 12:24 Anče
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
jedine co me prekvapuje na uvedenem prikladu je cas provedeni...

preci jen clovek by cekal ze skladani/volani binarek za sebe a predavani vysledku pres pipe neni nic moc efektivni...
$ time dmesg | awk '/CPU0/ { print $4 }'
real	0m0.016s
user	0m0.016s
sys	0m0.008s

$ time dmesg | grep CPU0 | cut -d' ' -f7
real	0m0.011s
user	0m0.012s
sys	0m0.004s
ke zminenemu perleni: to zni zajimave... porovnani napriklad python, perl awk a sed/cut/grep/atd. pro zpracovani textu... by mozna opravdu zaujalo vice lidi, co myslis Davide :-)
13.2.2011 18:11 imploder | skóre: 11
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Já nevím, mně připadá celkem zbytečné se učit Perl, když máme jiné jazyky, např. Python, které jsou jednodušší, přehlednější a tak celkově prostě lepší.
pavlix avatar 13.2.2011 23:52 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Já nevím, mně připadá celkem zbytečné se učit X, když máme jiné jazyky, např. Y, které jsou jednodušší, přehlednější a tak celkově prostě lepší.
Je mi líto, ale za X a Y jde dosadit naprosto cokoli, kde X i Y na daný úkol stačí.

Dokonce ani ta přehlednost v mnoha případech neplatí, dobře napsaná sada pravidel v Perlu může být daleko přehlednější.

Divné, že to říkám já, který v Pythonu plynně píšu, ale v Perlu jsem úplný začátečník a hlavní pomůckou při psaní kódu je Google.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
15.2.2011 13:29 imploder | skóre: 11
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Na RV je Perl asi lepší, to je fakt. Ale jinak bych ho nepoužíval, je to jazyk co je pomalý jako Python a je nepřehledný. Nemám rád, jak Perl nabádá k prasení. Ale tak ať si každý používá co uzná za vhodné, já Perl obecně za moc vhodný nepovažuju :-)
15.2.2011 15:52 Neřeknu
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Čistě z administrátorského hlediska perl má tu výhodu, že je stable/portable. Když něco napíšu v shellu nebo pythonu, tak si můžu být jist, že mi to na 2/3 strojů nepojede, zatímco s perlem tyhle problemy nemám. Ne všude je nejnovější distro. Jsou tu taky enterprise distribuce a jiné unixy. Udržovat stejnou verzi všude není něco co bych měl náladu dělat. Co bych z toho taky měl, že?

Krom toho jazyk, kde jsou bílé znaky významné, taky není moc kůl. Tuhle jsem komusi dělal skript v pythonu, on si tam upravil jeden string a přitom přidal před to nějakou mezeru a potom se děsně divil, že mu to nefunguje. To by se asi nikde jinde (whitespace je asi čestná výjimka :-)) nestalo.
15.2.2011 15:55 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
To by se asi nikde jinde (whitespace je asi čestná výjimka :-)) nestalo.

Makefile :-(

15.2.2011 18:40 Neřeknu
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Jak jsem jen mohl zapomenout... :-D Ale teď jsem to zkusil a VIM mně to zvýrazňuje jako chybu, tak chytrý to pythonu asi nebude, alespoň na to míchání tabu a mezer je `python -tt ...', jenže to neřeší všechno.
16.2.2011 17:48 imploder | skóre: 11
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Mezi Pythonem 2 a 3 (3 je zpětně nekompatibilní) je možné si vybrat, co používat. Jinak je to myslím v pohodě.

To byla ale chyba, že někdo kašle na odsazení v jazyce, kde je důležité. Mně se tahle vlastnost Pythonu líbí, udržuje se tak pořádek a není potřeba psát navíc složené závorky. Kód je tak kratší a vypadá přehledněji. Jenom je škoda, že do toho vnáší zmatek používání mezer/tabulotorů. Z pohledu sémantiky jsou jasné tabulátory, ale zase jsme zvyklí se dívat na kód někde jako na 2D obrázek a na to prostě potřebujeme pevné jednotky (mezera = 1 znak) a ne gumové tabulátory.
16.2.2011 18:31 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Těch problémů je víc - namátkou mne napadá třeba copy&paste nebo přenos e-mailem. U Makefile jsem ochoten to brát jako historický omyl, ale u Pythonu už to jednoznačně vnímám jako hrubou chybu návrhu.
16.2.2011 19:10 imploder | skóre: 11
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Nebo je to hrubá nedokonalost nástrojů používaných k manipulaci s tím kódem. Výsledkem je špatné odsazení a problém je v tom, že Python špatné odsazení nesnese, chápu to správně? Všechny editory, co za něco stojí, si s odsazováním poradí. Proč nutit programátory zabordelovat si kód závorkama a tolerovat špatné odsazení jenom proto, že úplně primitivní editory jako např. notepad nebo tahle textarea odsazování nepodporuje? Podle stejné logiky bysme neměli vyžadovat odsazování v kódu, aby se dobře upravoval někomu, kdo používá primitivní editor.
16.2.2011 19:11 imploder | skóre: 11
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Nebo ještě líp, odsazování zakázat. Na toho chudáka s notepadem a druhého s textareou přece musíme brát ohled ;-)
pavlix avatar 16.2.2011 19:59 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Na toho chudáka s notepadem a druhého s textareou přece musíme brát ohle
Jaký je mezi nimi rozdíl?
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
16.2.2011 21:22 imploder | skóre: 11
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Žádný. Oba jsou to na psaní kódu primitivní nástroje, ani jeden se nestará o odsazování.
16.2.2011 20:06 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Podsouváte mi něco, co jsem vůbec netvrdil. To, že by formátování bílého místa nemělo být syntakticky významné, přeci vůbec neznamená, že by se nemělo odsazovat. Přesně naopak: díky tomu, že v rozumně navržených jazycích syntakticky významné není, může si každý odsazovat tak, jak mu vyhovuje a jak se mu to líbí. Někdo dvěma mezerami, někdo čtyřmi, někdo tabulátorem. Žádná z těch variant není špatné odsazení a když dostanu jinak odsazený dokument, ať už proto, že autor použil jiný coding style, nebo proto, že to prošlo cestou, která formátování whitespace pozměnila, proženu to indentem nebo jiným automatickým nástrojem a mám to, jak jsem to chtěl. To jen fundamentalisté vykřikují, že existuje jeden Jediný Správný Způsob a všechno ostatní je špatně.
16.2.2011 21:21 imploder | skóre: 11
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Já vám to nepodsouvám, já jen konstatuju, kam můžeme dojít, když budeme vyžadovat, aby se programy daly pohodlně upravovat úplně hloupým editorem, a budeme tím omezovat syntaxi jazyka. Myšlenka: když upravuju (kopíruju bloky atd.) pěkně odsazovaný program v hloupém editoru, odsazení tím rozbiju a i když to jazyk nevyžaduje, měl bych to opravit (resp. musím, pokud chci zachovat v programu odsazování a tím dobrou čitelnost); znamená to tedy, že radši nemáme odsazovat, aby i úpravy v hloupém editoru vyhovovaly našim stylistickým konvencím? Problém s Pythonem je to samé, akorát výsledek nejen že odporuje stylistickým konvencím (nevypadá to hezky), ale navíc ani nefunguje správně. Podle mě to není takový problém, program bych stejně měl po úpravě hloupým editorem spravit, aby vypadal hezky. Python mě akorát donutí to udělat hned.
Někdo dvěma mezerami, někdo čtyřmi, někdo tabulátorem.
Python umožňuje odsazovat v podstatě jakýmkoliv počtem bílých znaků, jenom je potřeba, aby bylo v celém souboru jednotné. Jinak to může dělat divné věci.
To jen fundamentalisté vykřikují, že existuje jeden Jediný Správný Způsob a všechno ostatní je špatně.
Pokud je určitý způsob odsazování součástí syntaxe jazyka, tak je správný ten a jiný ne. V C++ si taky nemůžu říct, že se mi nelíbí složené závorky a místo nich chci psát třeba špičaté, protože se mi víc líbí.
16.2.2011 22:27 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Problém s Pythonem je to samé, akorát výsledek nejen že odporuje stylistickým konvencím (nevypadá to hezky), ale navíc ani nefunguje správně.

Pro vás je to možná "to samé, akorát…", pro mne je to naprosto zásadní rozdíl.

Pokud je určitý způsob odsazování součástí syntaxe jazyka, tak je správný ten a jiný ne.

Jistě. A já tvrdím, že formátování whitespace by nemělo být syntakticky významné.

13.2.2011 19:20 Sten
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Na one-linery je awk nenahraditelný:
kill $(ps -Af | awk '$8 ~ /nspluginwrapper/ { print $2 }')
Na složitější ale také raději perlím.
Jendа avatar 13.2.2011 19:48 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Nestačilo by killall nspluginwrapper?
14.2.2011 17:00 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Nejlépe použít na Solarisu :)
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
15.2.2011 18:51 Neřeknu
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Nebo na AIXu, jako root na produkčním serveru se SAPem a tisíci uživateli ve všední den... Když není nspluginwrapper, dá se to použít i na něco jiného... :-D
pavlix avatar 13.2.2011 23:54 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Nenahraditelný určitě není, ale pravdou je, že tohle v awku vypadá elegantněji.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
12.2.2011 19:32 Otto
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Gawk je skvělé,používám ho již 20let denně. Píšu většinou krátké skripty ,do 100 řádků. Nejčastěji používám funkci split,gsub a hlavně hashe.
pavlix avatar 13.2.2011 11:04 pavlix | skóre: 54 | blog: pavlix
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
AWK je verzatilní dost. :)
To jsem poznal, jak je verzatilní. Proto po zkušenostech přepisuju generátor webu do perlu.
Nejlepší je asi GNU AWK varianta.
Bez některých GNU rozšíření se s tím nedá pořádně pracovat.
Já už tu vlastně ani nejsem. Abclinuxu umřelo.
10.2.2011 08:35 pepazdepa
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Odpovědět | Sbalit | Link | Blokovat | Admin
kdyby nekdo zapasil s tim, jak pouzit jednoduchou uvozovku uvnitr awku (nebo sedu) tak ji staci napsat takto:
'\''
11.2.2011 15:54 zZ
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
jak pouzit jednoduchou uvozovku uvnitr awku
jak vložit jednoduchou uvozovku do textu uvozeného jednoduchými uvozovkami
tak ji staci napsat takto
tak to nejde a je potřeba text rozdělit a vložit ji mezi jeho části
'aaaa'\''bbbb' # "aaaa'bbbb"
11.2.2011 22:32 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Takže jste nakonec jen jinými slovy popsal přesně to, co kolega před vámi. :-)
12.2.2011 00:29 zZ
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
A pořád to má k přesnému popisu daleko :) Ale ne tak daleko, jako Pepíkův pokus, který je bez dalšího prostě nesmysl.
14.2.2011 00:03 Dejv | skóre: 37 | blog: Jak ten blog nazvat ... ? | Ostrava
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)

Ted uz zbyva jen vysvetlit nam neznalym, co to jsou ty jednoduche uvozovky (a dvojite uvozovky). Ja znam "jen" uvozovky a apostrofy.

Dejv
Pevně věřím, že zkušenější uživatelé mě s mými nápady usměrní a pošlou tam, kam tyto nápady patří...
14.2.2011 00:34 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)

Ten rozdíl je spíš sémantický. Unicode má sice tři různé znaky (U+0027 apostrophe, U+2018 left single quotation mark, U+2019 right single quotation mark), ale běžně se ale používá jen jeden (ten původní z ASCII). U programovacích jazyků včetně Bourne shellu je to o to zamotanější, že sémanticky jde sice o jednoduché uvozovky, ale pro otevírací i uzavírací se používá stejný znak, a to U+0027. A aby byl zmatek dokonalý, v seznamu unicode znaků se pro apostrof doporučuje používat U+2019 (right single quotation mark). :-)

U dvojitých uvozovek je to pak ještě komplikováno tím, že různé jazyky používají různé verze uvozovek (jako šestka/devítka, normálně/převráceně, dole/nahoře) a jejich kombinace - viz znaky U+201A až U+201F.

10.2.2011 19:35 Patrik Uhrak | skóre: 31 | blog: pato
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Odpovědět | Sbalit | Link | Blokovat | Admin

Zdravim,

v prvom rade velmi pekne dakujem za tento clanok, ako aj za vsetky predchadzajuce. Kazdy mi nieco dal, co je skvele.

Si pamatam, ked som spatril prirucku awk-u po prvykrat, tak som to nechal na dalsi vikend, ked budem mat viac casu. Uz ubehlo tych vikendov doteraz. Kazdopadne, tento clanok ma nakopol a som rad. Takze zacinam radsi uz dneska a cez vikend uz daco hadam vypotim zo seba.

pepe_ avatar 10.2.2011 19:44 pepe_ | skóre: 48
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Odpovědět | Sbalit | Link | Blokovat | Admin
Ten příklad u mne :

pepe@PC-Pepe:~$ dmesg | grep CPU0 | cut -d' ' -f2







7581.955546]
7581.980078]
9400.047266]
9400.074458]
9566.345718]
9566.373324]
CPU0
CPU0
pepe@PC-Pepe:~$ dmesg | awk '/CPU0/ { print $2 }'
0.000145]
0.077124]
0.508710]
46.174659]
46.199292]
57.310763]
57.348874]
7581.955546]
7581.980078]
9400.047266]
9400.074458]
9566.345718]
9566.373324]
CPU0
CPU0
pepe@PC-Pepe:~$ 

hi :)
10.2.2011 23:43 secret
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
ten priklad asi neni uplne idalni, ale to neni ten problem

AWK sam grupuje oddelovace (kdyz je nekolik mezer za sebou tak je to jeden oddelovac), kdezto cut ne (vic mezer za sebou je proste nekolik prazdnych sloupcu)

pro priklad pouziti treba ls -l
11.2.2011 13:03 deadmail
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Staci upravit ...
dmesg | grep CPU0 | tr -s ' ' | cut -d' ' -f2
A to iste vieme cez jeden awk ;-)
Jesus Jimenez avatar 11.2.2011 15:52 Jesus Jimenez | skóre: 29
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Odpovědět | Sbalit | Link | Blokovat | Admin
Název vznikl složením prvních písmen příjmení třech hlavních autorů AWKu: Alfred V. Aho, Peter J. Weinberger a Brian W. Kernighan.
Vida, ja mel dojem, ze je to jen zkratka pro AWKward... :)
Doaenův zákon průtahů: Čím pomaleji pracuješ, tím méně naděláš chyb. -- Murphy
12.2.2011 22:20 PeterS. | skóre: 10
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Odpovědět | Sbalit | Link | Blokovat | Admin
Veľmi užitočný článoček vďaka,

skušal som si niečo z toho precvičiť, išlo to celkom dobre, urobil som toto:
awk '{ if ( NF <= 20 ) {print NR  } }' test.txt
ale chcel by som aby výstup vyzeral takto:

NR : obsah riadku

Takže ako mu mám povedať že za 'NE " : "' ma vypísať celý riadok? Vopred vďaka za usmernenie
David Watzke avatar 12.2.2011 23:10 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
Proměnná $0 obsahuje aktuální záznam. Třeba:
print sprintf("%d: %s", NF, $0)
#nebo
print NR ": " $0
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
13.2.2011 00:14 PeterS. | skóre: 10
Rozbalit Rozbalit vše Re: Unixové nástroje – 21 (awk)
jasne, vďaka...
16.2.2011 16:46 inko
Rozbalit Rozbalit vše Vselico ide v awk
Odpovědět | Sbalit | Link | Blokovat | Admin
http://www.thegeekstuff.com/scripts/solve.awk

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.