Byl vydán Debian 13.5, tj. pátá opravná verze Debianu 13 s kódovým názvem Trixie a Debian 12.14, tj. čtrnáctá opravná verze Debianu 12 s kódovým názvem Bookworm. Řešeny jsou především bezpečnostní problémy, ale také několik vážných chyb. Instalační média Debianu 13 a Debianu 12 lze samozřejmě nadále k instalaci používat. Po instalaci stačí systém aktualizovat.
CiviCRM (Wikipedie) bylo vydáno v nové verzi 6.14.0. Podrobnosti o nových funkcích a opravách najdete na release stránce. CiviCRM je robustní open-source CRM systém navržený speciálně pro neziskové organizace, spolky a občanské iniciativy. Projekt je napsán v jazyce PHP a licencován pod GNU Affero General Public License (AGPLv3). Český překlad má nyní 45 % přeložených řetězců a přibližuje se milníku 50 %. Potřebujeme vaši pomoc, abychom se dostali dál. Pokud máte chuť přispět překladem nebo korekturou, přidejte se na platformu Transifex.
Další lokální zranitelností Linuxu je ssh-keysign-pwn. Uživatel si může přečíst obsah souborů, ke kterým má právo ke čtení pouze root, například soubory s SSH klíči nebo /etc/shadow. V upstreamu již opraveno [oss-security mailing list].
Singularity (YouTube) je nejnovější otevřený film od Blender Studia. Jedná se o jejich první 4K HDR film.
Vyšla hra Život Není Krásný: Poslední Exekuce (Steam, ProtonDB). Kreslená point & click adventura ze staré školy plná černého humoru a nekorektního násilí. Vžijte se do role zpustlého exekutora Vladimíra Brehowského a projděte s ním jeho poslední pracovní den. Hra volně navazuje na sérii Život Není Krásný.
Společnost Red Hat představila Fedora Hummingbird, tj. linuxovou distribuci s nativním kontejnerovým designem určenou pro vývojáře využívající AI agenty.
Hru The Legend of Zelda: Twilight Princess od společnosti Nintendo si lze nově díky projektu Dusklight (původně Dusk) a reverznímu inženýrství zahrát i na počítačích a mobilních zařízeních. Vyžadována je kopie původní hry (textury, modely, hudba, zvukové efekty, …). Ukázka na YouTube. Projekt byl zahájen v srpnu 2020.
Byla vydána nová major verze 29.0 programovacího jazyka Erlang (Wikipedie) a související platformy OTP (Open Telecom Platform, Wikipedie). Detailní přehled novinek na GitHubu.
Po zranitelnostech Copy Fail a Dirty Frag přichází zranitelnost Fragnesia. Další lokální eskalace práv na Linuxu. Zatím v upstreamu neopravena. Přiřazeno ji bylo CVE-2026-46300.
Sovereign Tech Agency (Wikipedie) prostřednictvím svého fondu Sovereign Tech Fund podpoří KDE částkou 1 285 200 eur.
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.
Nástroje: Tisk bez diskuse
Tiskni
Sdílej:
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í :).
přece jen perl byl vytvořen jako náhraa 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.
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 :).
$ 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
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.
) nestalo.
To by se asi nikde jinde (whitespace je asi čestná výjimka :-)) nestalo.
Makefile :-(
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.
Na toho chudáka s notepadem a druhého s textareou přece musíme brát ohleJaký je mezi nimi rozdíl?
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í.
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é.
kill $(ps -Af | awk '$8 ~ /nspluginwrapper/ { print $2 }')
Na složitější ale také raději perlím.
killall nspluginwrapper?
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.
'\''
jak pouzit jednoduchou uvozovku uvnitr awkujak vložit jednoduchou uvozovku do textu uvozeného jednoduchými uvozovkami
tak ji staci napsat taktotak to nejde a je potřeba text rozdělit a vložit ji mezi jeho části
'aaaa'\''bbbb' # "aaaa'bbbb"
Ted uz zbyva jen vysvetlit nam neznalym, co to jsou ty jednoduche uvozovky (a dvojite uvozovky). Ja znam "jen" uvozovky a apostrofy.
DejvTen 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.
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@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 :)
dmesg | grep CPU0 | tr -s ' ' | cut -d' ' -f2A to iste vieme cez jeden awk
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... :)
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
print sprintf("%d: %s", NF, $0)
#nebo
print NR ": " $0