Byla vydána nová verze 9.13 z Debianu vycházející linuxové distribuce DietPi pro (nejenom) jednodeskové počítače. Přehled novinek v poznámkách k vydání.
Na čem aktuálně pracují vývojáři GNOME a KDE Plasma? Pravidelný přehled novinek v Týden v GNOME a Týden v KDE Plasma.
Byla vydána nová stabilní verze 3.22.0, tj. první z nové řady 3.22, minimalistické linuxové distribuce zaměřené na bezpečnost Alpine Linux (Wikipedie) postavené na standardní knihovně jazyka C musl libc a BusyBoxu. Přehled novinek v poznámkách k vydání.
FEL ČVUT vyvinula robotickou stavebnici pro mladé programátory. Stavebnice Brian byla navržená speciálně pro potřeby populární Robosoutěže. Jde ale také o samostatný produkt, který si může koupit každý fanoušek robotiky a programování od 10 let, ideální je i pro střední školy jako výuková pomůcka. Jádro stavebnice tvoří programovatelná řídicí jednotka, kterou vyvinul tým z FEL ČVUT ve spolupráci s průmyslovými partnery. Stavebnici
… více »Ubuntu bude pro testování nových verzí vydávat měsíční snapshoty. Dnes vyšel 1. snapshot Ubuntu 25.10 (Questing Quokka).
Společnost Netgate oznámila vydání nové verze 2.8.0 open source firewallové, routovací a VPN platformy pfSense (Wikipedie) postavené na FreeBSD. Přehled novinek v poznámkách k vydání.
Byla vydána nová verze 6.16 živé linuxové distribuce Tails (The Amnesic Incognito Live System), jež klade důraz na ochranu soukromí uživatelů a anonymitu. Tor Browser byl povýšen na verzi 14.5.3. Linux na verzi 6.1.140. Další změny v příslušném seznamu.
Člověk odsouzený za obchod s drogami daroval letos ministerstvu spravedlnosti 468 kusů kryptoměny bitcoin, které pak resort v aukcích prodal za skoro miliardu korun. Darováním se zabývá policejní Národní centrála proti organizovanému zločinu (NCOZ). Deníku N to potvrdil přímo ministr spravedlnosti Pavel Blažek (ODS). Podle resortu bylo nicméně vše v souladu s právem.
Svobodný a otevřený multiplatformní editor EPUB souborů Sigil (Wikipedie, GitHub) byl vydán ve verzi 2.5.0. Stejně tak doprovodný vizuální EPUB XHTML editor PageEdit (GitHub).
Na základě národního atribučního procesu vláda České republiky označila Čínskou lidovou republiku za zodpovědnou za škodlivou kybernetickou kampaň proti jedné z neutajovaných komunikačních sítí Ministerstva zahraničních věcí ČR. Tato škodlivá aktivita, která trvala od roku 2022 a zasáhla instituci zařazenou na seznam české kritické infrastruktury, byla provedena kyberšpionážní skupinou APT31, veřejně spojovanou se zpravodajskou službou Ministerstvo státní bezpečnosti (MSS).
array=($(cat mujsoubor.txt)) <- ve skutecnosti je tam slozitejsi sed a awk, ktery z procesuje soubor a udela vystup viz nize
mujsoubor.txt radek;654645 jana;13221 andrea;55465 ...
ted bych potreboval jednotlive radky ulozit do promennych, zkousel jsemwhile IFS=';' read jmeno cislo; do echo $jmeno echo $cislo done < ${array[*]}Ale bohuzel takto mi to nefunguje, poradite? Zkousim v bashi. Diky
mujsoubor.txt radek;654645 jana;13221 andrea;55465Retezec 'mujsoubor.txt' se nachazi v souboru a je potreba jej vynechat? Soubor obsahuje jeden dlouhy retez nebo radky? Je treba spojit 'radek' a 654645, nebo 654645 a 'jana'? K cemu je pak retezec 'radek'? Nezname format vstupniho souboru, ani vystupniho, je mozne, ze cele reseni lze nafromatovat rovnou ze vstupniho souboru, bez zbytecnych cyklu. Konecne pokud se jedna o domaci ulohu, tak ta sem nepatri vubec.
mujsoubor.txt radek;654645 jana;13221 andrea;55465Muj cil je tento seznam projet a nacist si pokazde prvni promennou=radek a druhou=654654, atd, dokud jsou tam radky. Omlouvam se za zmateni
. mujsoubor.shTa tečka vpředu není překlep, ale příkaz.
cat mujsoubor.txt | while IFS=';' read cislo jmeno; do echo $jmeno echo $cislo doneale stejně by to v AWK bylo rychlejší a pohodlnější:
cat mujsoubor.txt | awk 'BEGIN {RS=";"} {print $2, $1}'Ovšem cpát to do pole je nesmysl. Máš k tomu nějaký závažný důvod?
Tohle by měla být povinná četba, klidně místo Lojzy Jiráska.
Ne, já budu napřed mudrovat, protože pipeline začínající na cat
jednoho souboru je prostě špatný příklad, celkem bez ohledu na okolnosti. Povaluje se na webu v nesčetných obměnách a přijde mi zbytečné přidávat další. Jak si to tazatel upraví, aby mu to četlo pipe z jiného programu, to už je jeho věc.
Děkuji, ale dobře jsem rozuměl, co tím myslel. Výsledkem ovšem je, že se na webu povalují zase další dva špatné příklady použití cat
(který má, pravda, představovat „něco jiného“). Ať tak nebo tak, ty příklady jsou prostě špatné. Když už ne kvůli procesu navíc, tak třeba kvůli subshellu. Pro ilustraci je nejlepší třeba tohle:
cat /etc/passwd | readarray -t pole_na_hovno readarray -t pole_s_daty < /etc/passwd
První pole bude prázdné (protože takhle pipe prostě funguje, forknutý shell nemůže ovlivnit proměnné v tom původním), zatímco to druhé bude definované v „hlavním“ shellu, jak by člověk čekal. Při čtení dat do pole je cat
jednoho souboru a následný pipe v podstatě zdrojem chyb číslo jedna. Když nahradíme cat
za něco jiného, nijak to nepomůže. Tentýž problém tam bude pořád. Snad jediný případ, kdy cat
jednoho souboru dává smysl, je něco takového:
{ sed 's/\(^[^:]\+\):/another\1:/' /etc/passwd; cat /etc/passwd; } | další | zpracování
Tohle^^^ je samozřejmě ptákovina, ale umím si představit, že by to s drobnou obměnou mohlo dělat něco smysluplného. Možná je ale přehlednější tohle:
cat <(sed 's/\(^[^:]\+\):/another\1:/' /etc/passwd) /etc/passwd | další | zpracování
A to už není cat
jednoho souboru, takže to je celkem OK. První možnost může být o něco efektivnější, protože výstup ze sed
u nemusí přežvýkat cat
. Pokud ovšem cat
i shell používají v tomto případě splice()
, je to nakonec jedno, co do efektivity.
První a nejsnazší možnost je tohle:
while read line; do IFS=';' read jmeno cislo <<<"${line}" echo "Jméno: ${jmeno}" echo "Číslo: ${cislo}" done < mujsoubor.txt
Pokud chceš experimentovat s polem a načíst si řádky napřed do pole, to je samozřejmě taky možné:
readarray -t lines < mujsoubor.txt for line in "${lines[@]}"; do IFS=';' read jmeno cislo <<<"${line}" echo "Jméno: ${jmeno}" echo "Číslo: ${cislo}" done
Pro úplnost dodávám, že vstupní soubor vypadá takto…
radek;654645 jana;13221 andrea;55465
…a výstup z tohoto „parseru“ vypadá v obou případech takto:
Jméno: radek Číslo: 654645 Jméno: jana Číslo: 13221 Jméno: andrea Číslo: 55465
Všechny výše uvedené parametry jsou popsané v man bash
; stačí si najít kapitolu zvanou Shell Builtin Commands, která je tam někde ke konci.
Jo a mimochodem, pole přináší jistý bonus navíc v podobě indexů, které můžeš použít třeba pro následující trik, chceš-li:
readarray -t lines < mujsoubor.txt echo "Počet položek adresáře: ${#lines[@]}" for index in "${!lines[@]}"; do IFS=';' read jmeno cislo <<<"${lines[index]}" echo "$((index + 1)). záznam: Jméno: ${jmeno} Číslo: ${cislo}" doneVýstup z posledního skriptu bude pak následující:
Počet položek adresáře: 3 1. záznam: Jméno: radek Číslo: 654645 2. záznam: Jméno: jana Číslo: 13221 3. záznam: Jméno: andrea Číslo: 55465
Z výše uvedeného už snad nebude problém nějaký vhodný parsovací skript vymyslet.
Aha! Příliš jsem se nechal unést iterací přes pole a parsováním řádků za každou cenu. On ale read
sám od sebe umí všechno potřebné, takže ještě kratší (se stejným výstupem) bude tohle:
while IFS=';' read jmeno cislo; do echo "Jméno: ${jmeno}" echo "Číslo: ${cislo}" done < mujsoubor.txt
Tiskni
Sdílej: