abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×

    dnes 15:11 | Nová verze

    Vývojáři desktopového prostředí Enlightenment (Wikipedie) a souvisejících knihoven Enlightenment Foundation Libraries (EFL) vydali nové verze. Enlightenment byl vydán ve verzi 0.28.0 a Enlightenment Foundation Libraries ve verzi 1.29.

    Ladislav Hagara | Komentářů: 3
    dnes 13:55 | Zajímavý článek

    Cloudflare zjistil, že některé odpovědi modelu GLM-5.3 obsahovaly části dat z předchozích požadavků jiných zákazníků. Příčinou byla kombinace chybné konfigurace a chyby v inference enginu SGLang. Model podporoval kontextové okno 1 048 576 tokenů, ale GPU KV cache pool měl kapacitu pouze 681 280 tokenů. Při překročení kapacity docházelo k nesprávnému zpracování odmítnutého požadavku. Decode část systému následně pracovala se starými

    … více »
    vencour | Komentářů: 0
    dnes 13:00 | Zajímavý článek

    Vývojáři Knot Resolver vysvětlují, jak změnili rozhodování o tom, které DNS záznamy ponechat v cache a které odstranit. Článek obsahuje skutečná měření: devět hodin DNS provozu při 2 000 QPS, srovnání cache o velikosti 25 MB a 40 GB a také porovnání s BIND 9, kromě algoritmů obsahuje konkrétní doporučení pro konfiguraci a diagnostiku.

    vencour | Komentářů: 0
    včera 13:44 | IT novinky

    Největší kryptoměnová burza světa Binance se stala terčem útoku, při kterém podvodníci odcizili během několika minut kryptoměny v hodnotě přibližně 6,3 miliardy dolarů. Jedná se o největší kryptoměnovou krádež v historii, přibližně čtyřikrát větší než loňský útok na burzu Bybit. Binance se podařilo ve spolupráci s partnery zmrazit aspoň aktiva v hodnotě zhruba 3 miliard dolarů a slíbila, že veškeré ztráty pokryje z vlastních prostředků.

    Ladislav Hagara | Komentářů: 16
    včera 02:16 | Bezpečnostní upozornění

    Zranitelnost CVE-2026-98432 s CVSS 9.8 odhalila AI od společnosti Anthropic. Jedná se o kritickou chybu v implementaci MPTCP (multipath TCP). Debian vydal patche 16.10. a 22.10., ale např. Ubuntu je zatím bez opravy. Více informací na The Hacker News.

    Max | Komentářů: 20
    29.10. 23:22 | Zajímavý software

    Na Slovensku vznikla úplne nová rally hra, ktorá je zadarmo a funguje vo Windowse, Linuxe či na Macu. Greenie Rally má viac ako 50 tratí a vozidiel, šampionáty či turnaje. Má retro feeling a imituje automobilové hry z prelomu tisícročí. Vyskúšate prejsť všetky mapy na Škode 130RS?

    Stanislav Hoferek | Komentářů: 7
    29.10. 14:33 | Komunita

    Do základního systému NetBSD -current byl přidán nový editor atto jako alternativa k editorům vi a xedit.

    Ladislav Hagara | Komentářů: 1
    29.10. 14:11 | IT novinky

    Společnost System76 představila kompaktní 11litrový Thelio Prime Desktop. S procesorem AMD Ryzen 9000. S Pop!_OS 24.04 LTS s desktopovým prostředím COSMIC nebo Ubuntu 24.04 LTS.

    Ladislav Hagara | Komentářů: 0
    29.10. 13:44 | Humor

    Čínská státní televize pozastavila vysílání španělské La Ligy a čínské internetové platformy omezily obsah s Kylianem Mbappém poté, co slavný fotbalista ve francouzském pořadu The Bridge mluvil o svém oblíbeném memu, v němž je jeho tvář vložena do portrétu zobrazujícího diktátora Mao Ce-tunga. 'Můj oblíbený mem je ten, na kterém dali můj obličej na čínského diktátora. To mě opravdu rozesmívá. S přáteli ho používám pořád' řekl,

    … více »
    Pendrekama do nich❗ | Komentářů: 16
    29.10. 13:22 | IT novinky

    Při příležitosti oslav Dne vzniku samostatného československého státu (28. října) byly uděleny medaile Za zásluhy tvůrci aplikace Záchranka Filipu Maleňákovi, vědci v oblasti umělé inteligence Tomáši Mikolovovi a Olze Štěpánkové, vědkyni zabývající se kybernetikou, robotikou a strojovým učením, průkopnici v oblastech výuky a využití umělé inteligence v medicínském inženýrství.

    Pendrekama do nich❗ | Komentářů: 8
    Které desktopové prostředí na Linuxu používáte?
     (9%)
     (7%)
     (4%)
     (20%)
     (29%)
     (9%)
     (5%)
     (2%)
     (14%)
     (20%)
    Celkem 2954 hlasů
     Komentářů: 34, poslední 26.10. 08:24
    Rozcestník

    Unixové nástroje – 17 (printf, wc, nl, tee)

    11. 8. 2010 | David Watzke | Návody | 10901×

    V tomto díle si představíme program printf sloužící k formátování a výpisu textu, dále wc, který umí spočítat počet řádků, slov, znaků či bajtů v textu, potom nl, který umí očíslovat řádky, a nakonec tee, který umí výstup jiného programu ukládat do souboru a zároveň vypisovat na standardní výstup.

    Obsah

    printf

    link

    Příkaz printf je podobný stejnojmenné standardní funkci jazyka C a slouží k formátování a výpisu textu. Název je zkratka anglického výrazu print formatted, tedy tisknout formátovaně.

    Lze ho používat jako alternativu dříve zmiňovaného příkazu echo, ovšem zde se sluší zmínit diskuzní vlákno, které pod článkem vzniklo, a také citovat SUS standard, ze kterého pro tento článek čerpám. Přímo standard doporučuje se používání echo vyhnout a v nových skriptech používat printf, protože je přenositelnější (a lze pomocí něj snadněji vypsat „-n“ :-)).

    Jak se printf používá? Stejně jako v C, ovšem s tím rozdílem, že Bash nerozlišuje datové typy, takže i čísla lze vypsat jako řetězce.

    $ printf "Váš domovský adresář je %s\n" $HOME
    Váš domovský adresář je /home/dave
    
    $ printf "%f %f %.1f\n" 123 124,45 12
    123,000000 124,450000 12,0
    

    Nerad bych diskriminoval uživatele C netknuté, proto použití trochu rozeberu: Jako první argument se zadává řetězec s formátováním, obsahující fixní řetězce (např. „ahoj“), escapovací sekvence (např. „\n“ pro nový řádek, „\\“ pro zpětné lomítko či „\t“ pro horizontální odsazení – tab), a také řetězce, které budou nahrazeny za proměnné („%s“ za řetězec, „%d“ za celé číslo, „%f“ za desetinné číslo, „%c“ za 1 znak, atp.). Další argumenty jsou řetězce, které budou dosazeny za proměnné umístěné v prvním argumentu.

    $ printf "První řetězec: %s, druhý řetězec: %s, atd.\n" str1 str2
    První řetězec: str1, druhý řetězec: str2, atd.
    
    $ n=42,12
    $ printf "Formátujeme číslo:\n\tCelé číslo: %.0f\n\t3 desetinná místa: %.3f\n" $n $n
    

    Dávejte si pozor na oddělovač desetinného místa. Pokud váš systém používá českou locale (snadno zjistíte příkazem locale), potom je oddělovač čárka, zatímco ve výchozím locale („C“) je to tečka a v jiných to může být zase jiný znak, takže na to nespoléhejte. A chcete-li napsat znak „%“ tak, jak je, pište „%%“.

    $ printf "%%c vypíše pouze 1 znak ze zadaného řetězce: %c%c%c%c%c\n" z n "" a ky
    %c vypíše pouze 1 znak ze zadaného řetězce: znak
    

    wc

    link

    Program wc slouží ke zjištění počtu řádků, slov, znaků či bajtů v daném textu. Název je zkratkou word count, česky počet slov.

    Text lze programu zadat na standardní vstup

    # vypíše počet řádků, které by příkaz „ps ax“ jinak vypsal na výstup
    $ ps ax | wc -l
    195
    
    # vypíše počet bajtů textu v /proc/cpuinfo
    $ wc -c < /proc/cpuinfo
    3240
    

    nebo je možné dodat názvy souborů, které se mají analyzovat. Použijete-li wc takto, vypíše za požadovaná čísla ještě název souboru.

    # vypíše počet řádků, slov a bajtů textu v daném souboru
    $ wc qconf.patch
     46 115 921 qconf.patch
    

    Z komentářů u jednotlivých ukázek je zřejmé, že wc bez argumentů vypíše počet řádků, slov a bajtů (v tomto pořadí) a že lze zajistit i výpis jen požadovaných počtů: Přepínač -l (v GNU též --lines) zajistí výpis počtu řádků, -w (v GNU i --words) počet slov, -c (v GNU také --bytes) počet bajtů a ještě jsem nezmínil přepínač -m (v GNU i --chars), který slouží pro výpis počtu znaků.

    nl

    link

    Program nl slouží k očíslování řádků. Název je zkratkou number lines, česky očísluj řádky.

    Základní použití je zjevné:

    $ printf "raz\ndva\ntři\n" > txt
    $ nl txt
         1  raz
         2  dva
         3  tři
    

    Stejného efektu lze docílit pomocí cat -n:

    $ cat -n txt
    

    S využitím přepínačů lze ovšem docílit i komplexnějšího číslování. Přepínačem -v lze určit, jakým číslem číslování začne (výchozí je 1, programátoři si mohou nastavit 0). Přepínačem -i lze ovlivnit, o kolik bude číslo růst s každým novým řádkem (výchozí hodnota je 1).

    $ nl -v 0 -i 2 txt
         0  raz
         2  dva
         4  tři
    

    Pomocí přepínače -b lze určit, které řádky budou číslovány. S argumentem „a“ budou očíslovány všechny řádky, s „t“ pouze neprázdné řádky, s „n“ žádné řádky a s „pregex“ budou očíslovány pouze řádky odpovídající základnímu regulárnímu výrazu regex:

    # očísluje pouze řádky, které začínají řetězcem „int“
    grep "int" zdrojak.C | nl -b p^int
    

    Přepínač -w umožňuje zadat počet znaků použitých pro číslo řádku. Výchozí počet je 6. Přepínač -s umožňuje změnit oddělovač čísla řádku od samotného textového obsahu řádku. Výchozí oddělovač je tab.

    $ nl -w 2 -s ": " txt
     1: raz
     2: dva
     3: tři
    

    tee

    link

    tee je program, který umí data, jež jsou mu předána na standardní vstup, ukládat do souboru a zároveň je vypisovat na standardní výstup. Název vychází z toho, jak angličané vyslovují samotné písmeno „T“.

    Dovolil jsem si pro ilustraci vypůjčit (GPL) obrázek z wikipedie a lokalizovat jej, protože velmi pěkně vystihuje to, co tee dělá (a proč se tak jmenuje):

    tee

    Představte si, že chcete spustit upovídaný program a přejete si jeho std. výstup ukládat do souboru, a zároveň si jej číst, hned jak je vypisován.

    # takto docílíte pouze první část požadavku (std. výstup je ukládán do souboru)
    # na výstupu uvidíte jen stderr, čili std. chybový výstup
    $ ls -l /usr/bin > soubor.txt
    
    # řešení pomocí tee
    $ ls -l /usr/bin | tee soubor.txt
    

    Je důležité si uvědomit, že když tee umístíte za rouru, jako jsem to udělal v předchozí ukázce, tak se na std. vstup dostane pouze to, co program před rourou vypisoval na std. výstup, ale už ne to, co vypisoval na chybový výstup (stderr). Pokud chcete ukládat obojí (a mít tak v souboru uložený kompletní výstup programu tak, jak jej vidíte na terminálu), potom je třeba provést patřičné přesměrování výstupu programu.

    $ make 2>&1 | tee kompletni_vystup.txt ../dalsi_kopie_vystupu.txt
    

    Nakonec zmíním ještě dostupné přepínače. Přepínač -a (v GNU též --append) zajistí, aby se daný soubor, pokud již existuje, nepřepsal, ale aby se místo toho výstup připojil na jeho konec. Přepínač -i (v GNU též --ignore-interrupts) zajistí ignorování signálu SIGINT, který se příkazu pošle například stisknete-li Ctrl+C při jeho provádění.

           

    Hodnocení: 100 %

            špatné • dobré        

    Nástroje: Tisk bez diskuse

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    11.8.2010 02:25 Mrkva | skóre: 22 | blog: urandom
    Rozbalit Rozbalit vše Re: Unixové nástroje – 17 (printf, wc, nl, tee)
    Nikdy mi nešlo do hlavy, jak někdo může pojmenovat program wc..
    We lived, we danced, we raced, we run, from the oblivion to come, Dressed for the last dance of a hundred thousand suns.
    11.8.2010 06:17 Joker
    Rozbalit Rozbalit vše Re: Unixové nástroje – 17 (printf, wc, nl, tee)
    Přece abys mohl říct, že výstup nějakého programu posíláš rourou do wc, ne?
    tsLnox avatar 11.8.2010 08:22 tsLnox | skóre: 31 | blog: Blog jednoho ukecaného Gentoolemana | Žďár nad Sázavou
    Rozbalit Rozbalit vše Re: Unixové nástroje – 17 (printf, wc, nl, tee)
    Rourou do wc... :-D A kolega se diví, co že je na tý práci tak vtipnýho :-D
    11.8.2010 16:32 Mortal | skóre: 26 | blog: mortals_log
    Rozbalit Rozbalit vše Re: Unixové nástroje – 17 (printf, wc, nl, tee)
    Word Count?
    V pekle jsou samé diskety a ďábel je velká disketová mechanika
    11.8.2010 17:54 Mrkva | skóre: 22 | blog: urandom
    Rozbalit Rozbalit vše Re: Unixové nástroje – 17 (printf, wc, nl, tee)
    Nejsem až tak blbej, abych to nevěděl :) Ale stejně tak to může být Water Closet :)
    We lived, we danced, we raced, we run, from the oblivion to come, Dressed for the last dance of a hundred thousand suns.
    11.8.2010 08:38 cynan | skóre: 3
    Rozbalit Rozbalit vše Re: Unixové nástroje – 17 (printf, wc, nl, tee)
    Uz jsem videl nekolik clanku/serialu o prikazech v bash a tenhle se mi libi asi nejvic. Bez zbytecnych kecu vypichuje podstatne informace. I kdyz si myslim, ze jsem zkuseny bash coder, tak se vzdy neco noveho dozvim nebo aspon osvezim. Takze diky.
    nejlepsi je Ferda
    11.8.2010 10:18 lib | skóre: 9
    Rozbalit Rozbalit vše Re: Unixové nástroje – 17 (printf, wc, nl, tee)
    S tím tee jsem narazil na podivnou věc: měl jsem program, který vypisoval během své činnosti do std výstupu řádky logu, okamžitě, po každé akci rovnou naskočil řádek na terminálu. Potřeboval jsem, abych měl zároveň kopii do souboru. Použil jsem tee, tak jak je popsáno a věci přestaly fungovat. Zápisy naskakovaly vždy po delší době, několik řádků najednou a často ještě ne celých. Někde najednou začal působit nějaký buffer. Hledal jsem na webu, ale nenašel jsem jak nastavit unbuffered in/out pro tee...
    David Watzke avatar 11.8.2010 10:35 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Unixové nástroje – 17 (printf, wc, nl, tee)
    To je hodně zvláštní, vzhledem k tomu, že standard jasně říká:
    The tee utility shall not buffer output.
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    11.8.2010 11:40 lib | skóre: 9
    Rozbalit Rozbalit vše Re: Unixové nástroje – 17 (printf, wc, nl, tee)
    No právě.

    Asi to bufferuje shell.
    11.8.2010 13:06 chochi | skóre: 29 | Praha
    Rozbalit Rozbalit vše Re: Unixové nástroje – 17 (printf, wc, nl, tee)
    Ahoj, to je vlastnost toho programu (standartnich C funkci pro vystup). Pokud je vystup typu terminal tak se dela "line buffer" (vypisuje se po radcich), jinak se dela "block buffer" (vypisuje se po blocich znaku stejne delky). Nevim jestli existuji nejake nastroje (treba promenne prostredi) jak toto chovani zmenit.
    11.8.2010 13:47 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Unixové nástroje – 17 (printf, wc, nl, tee)
    Musíte místo trubky použít pseudoterminál. Bash to bohužel neumí, ale třeba některé moduly v perlu jo.
    In Ada the typical infinite loop would normally be terminated by detonation.
    11.8.2010 16:48 lib | skóre: 9
    Rozbalit Rozbalit vše Re: Unixové nástroje – 17 (printf, wc, nl, tee)
    něco takového jsem se také dočetl, ale nepochopil jsem, jak mám vytvořit "pseudoterminál" a vlastně ani co se tím myslí. Docela mne deprimuje, proč bych měl zcela základní funkcionalitu shellu nahrazovat perlem. Perl neumím a co teď? Mám se ptát v poradně abclinuxu? Jinak dotazů na tenhle problém jsem na googlu našel dva tisíce. Nechápu, proč si člověk nemůže nastavit buffering mode (block, line, unbuffered) přímo v bashi.
    11.8.2010 21:53 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Unixové nástroje – 17 (printf, wc, nl, tee)
    Docela mne deprimuje, proč bych měl zcela základní funkcionalitu shellu nahrazovat perlem.

    Protože shell má jen omezené možnosti využití. Od jisté hranice je lepší použít nějaký silnější nástroj. Tvorba pseudo terminálu je patrně za touto hranicí.
    Perl neumím a co teď?

    Zkuste se to naučit, třeba se Vám zalíbí.
    Mám se ptát v poradně abclinuxu?
    Určitě.
    Jinak dotazů na tenhle problém jsem na googlu našel dva tisíce.
    Pak je to asi častý problém. Čím častější, tím déle se řeší :)
    Nechápu, proč si člověk nemůže nastavit buffering mode (block, line, unbuffered) přímo v bashi.
    Protože to nemá nic společného s bashem, ale se způsobem jak funguje OS.

    BTW, podle toho komentáře níže byste možná mohl uspět také s tím příkazem stdbuf.
    In Ada the typical infinite loop would normally be terminated by detonation.
    11.8.2010 19:21 petr_p | skóre: 59 | blog: pb
    Rozbalit Rozbalit vše Re: Unixové nástroje – 17 (printf, wc, nl, tee)
    Nástroj existuje. Coreutils obsahují stdbuf(1).
    11.8.2010 22:49 lib
    Rozbalit Rozbalit vše Re: Unixové nástroje – 17 (printf, wc, nl, tee)
    Pánové děkuji, tohle (stdbuf) je asi to, co hledám. Dva tisíce dotazů a první rozumná odpověď tady na abclinuxu! Hned zítra vyzkouším v ostrém provozu, zda a jak to funguje.
    David Watzke avatar 11.8.2010 22:52 David Watzke | skóre: 74 | blog: Blog... | Praha
    Rozbalit Rozbalit vše Re: Unixové nástroje – 17 (printf, wc, nl, tee)
    Jenže hnedka v helpu se píše, že na tee to nefunguje :-(
    “Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
    12.8.2010 10:50 petr_p | skóre: 59 | blog: pb
    Rozbalit Rozbalit vše Re: Unixové nástroje – 17 (printf, wc, nl, tee)

    Protože si myslí, že tee místo fwrite(3) použije write(2), který žádný buffer sám o sobě nezavádí. To ovšem vůbec nemusí být pravda, klidně může použít fwrite(3), ale bufferování musí podle POSIXu vypnout.

    Takže bych se osobně přikláněl k verzi, že konkrétní implementace tee byla prostě rozbitá. Jestli na stdout zapisuje tee nebo jiný proces, je totiž z hlediska terminálu jedno.

    16.8.2010 11:19 ciernabiela | skóre: 2
    Rozbalit Rozbalit vše Re: Unixové nástroje – 17 (printf, wc, nl, tee)
    Zkousel jsem tohle:
    $ printf "Hello world!"
    bash: !": event not found
    $ printf 'Hello world!'
    Hello world!
    
    Jakym zpusobem ale vyresit nasledujici? Expanze promenych vs. specialni znaky, tzn. chci zobrazit hodnotu prom. HOME ale nechci aby mi bash hlasil chybu 'event not found'.
    $ printf "$HOME !" 
    bash: !": event not found
    vs.
    $ printf '$HOME !' 
    $HOME !
    
    Asi takhle:
    $ printf '%s !' $HOME
    
    Nebude teda lepsi davat formatovaci retezec do jednoduchych uvozovek (v pripade BASHe)?
    16.8.2010 18:39 pht | skóre: 48 | blog: pht
    Rozbalit Rozbalit vše Re: Unixové nástroje – 17 (printf, wc, nl, tee)
    $ printf '%s !' $HOME
    Raději:
    $ printf '%s !' "$HOME"
    
    Nebude teda lepsi davat formatovaci retezec do jednoduchych uvozovek (v pripade BASHe)?
    Určitě.

    Bonusová otázka: co je špatně u následujícího?
    $ printf "$HOME"'!'
    In Ada the typical infinite loop would normally be terminated by detonation.

    Založit nové vlákno • Nahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.