LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> Perl (57) - Jednořádkové skripty

Dnešní díl bude ryze praktický. Předvedeme si na konkrétních příkladech, jak využít příkaz perl jako nástroj přímo v shellu.

25.5.2007 06:00 | Jiří Václavík | Články autora | přečteno 18399×

Pro spouštění skriptů v jazyce Perl není bezpodmínečně nutné, aby byl uložen v souboru. Pro krátké programy, skládající se z minima příkazů, je zde možnost spouštění přímo přes příkazový řádek. Takové skripty můžeme nazývat jednořádkové (někdy se lze setkat s názvem oneliners).

V 56. díle seriálu jsme se zabývali některými z přepínačů, které Perl akceptuje. Zmínka přišla i na volbu -e, která umožňuje spouštět kód Perlu z příkazového řádku.

Jednořádkové skripty se využívají zejména při práci s textem. Předvedeme si několik příkladů. Ne všechny budou praktické, ale pro představu o možnostech uveďme co nejširší záběr.

Hello World

Nejjednodušším příkladem z této kategorie je obyčejný výpis textu.

$ perl -e 'print "Hello World\n"'

Jak ukazuje následující příkaz, přepínačů -e může být i více.

$ perl -e 'print "Hello ";' -e 'print "World\n"'

Výpis pole @INC

Pro přehlednou informaci o obsahu pole @INC zadejme následující příkaz.

$ perl -e 'for(@INC){print "$_\n";}'

Přejmenování všech souborů v adresáři

Pojďme však k příkladům, které mohou být opravdu užitečné. Nejednou se stane, že potřebujeme hromadně změnit jména skupiny souborů. Variantou takového programu je změna velikosti písmen v názvech soborů na malá.

$ perl -e 'for (<*>) {rename $_, lc($_)}'

Tento skript lze modifikovat tak, aby na malá písmena přejmenoval jen názvy uvedených souborů. Použijeme k tomu pole @ARGV.

$ perl -e 'for (@ARGV) {rename $_, lc($_)} soubor1 soubor2

S funkcí rename lze vymýšlet i složitější věci. Kupříkladu následující příkaz přejmenuje všechny soubory v aktuálním adresáři tak, aby začínali vždy rokem, ve kterém byly naposledny změněny.

$ perl -e 'for (<*>) {rename $_, 1900+(localtime((stat)[9]))[5]."$_"}'

A podobně. Takovéto příkazy mohou v mnohém připomínat použití unixového příkazu find, pomocí nějž lze dělat podobné věci.

Nahrazení slov

Možná vůbec nejčastějším onlinerem je nahrazení části textu, která vyhovuje danému regulárnímu výrazu. Vytvoříme skript, který v uvedených soubourech nahradí libovolný počet mezer za sebou mezerou jedinou.

$ perl -pi -e 's/ +/ /g' soubor1 soubor2

Připomenutí události

Pokud se vám stává, že si necháte vařit čaj, zasednete k počítači a zapomnenete na vše kolem, jistě přivítáte následující skript.

$ perl -e 'if (!fork){sleep $ARGV[0]*60;print "\nCAJ UVAREN!!!\a\n";exit;}exit;' 7

Ten se od okamžiku spuštění neozývá, ale to je jen zdání, protože zatím nenápadně čeká na pozadí, aby se mohl za zadaný počet minut spustit a vyvést tak uživatele z tranzu.

Je to spíše taková hračka, ale pokud by se vám zalíbila natolik, že byste ji chtěli mít stále po ruce, vytvořte si třeba soubor /usr/bin/wake s právy pro spouštění a následujícím obsahem.

#!/usr/bin/env perl
if (!fork){sleep $ARGV[0]*60;print "\n".$ARGV[1]."\a\n";exit;}exit;

Nyní zadejme tento příkaz.

$ wake 120 'PROBUĎ SE'

Za 2 hodiny můžeme čekat upozornění.

Smazání daných řádků v souboru

Pro smazání 3. až 7. řádku v souboru použijme příkaz

$ perl -i.old -ne 'print unless 3..7' soubor

Konverze měn

Dalším příkladem je vytisknutí souboru, ve kterém zaměníme ceny v amerických dolarech za ceny v českých korunách. Jako kurz budeme brát hodnotu 20.5CZK/USD.

$ perl -pe 's/(\d+.?\d*)USD/20.5*$1."CZK"/ge' soubor

Získání WWW stránky

Alternativou k příkazu lynx -source je následující, tentokrát poněkud delší zápis.

$ perl -MLWP::Simple -e 'mirror("http://www.linuxsoft.cz", "linuxsoft.html")'

Nicméně jeho modifikací můžeme smysl tohoto příkazu upravit. Například výpis hlavičky na standardní výstup.

$ perl -MLWP::Simple -e'print head "http://www.linuxsoft.cz"'

Spolupráce s find

Abychom si předvedli něco trochu jiného, podívejme se na následující příkaz.

$ echo soubor | perl -nle unlink

Jeho činnost je již asi zřejmá. Maže soubor, který mu byl předán rourou. Příkaz tak lze využít například na základě výstupu příkazu find.

$ find . -name '.backup' | perl -nl -e 'unlink'

Nutno však podotknout, že stejného efektu bychom docílili i definicí akce přímo pomocí find.

$ find . -name '*2*' -exec rm -f {} \;

Vytisknutí části souboru

Dalším příkladem, který můžeme v praxi čas od času užít je výpis konkrétních řádků souboru, určených rozsahem. Pro vytisknutí řádků 7-12 v uvedeném souboru lze psát tento příkaz.

$ perl -ne 'print if 7 .. 12' soubor

Hromadná změna práv

Další příkaz mění práva všech souborů aktuálního adresáře, které začínají písmenem d.

$ perl -e 'while(<*>){chmod 0700, $_ if /^d/}'

Pro vykonání této činnosti by však asi bylo pohodlnější použít find.

Očíslování řádků

Pro vytisknutí souboru na výstup s tím, že budou jednotlivé řádky označeny svým pořadím, napíšeme toto.

perl -n -e 'printf "%3d. %s",$.,$_' soubor

Závěr

Ukázali jsme, že jednořádkové skripty zvládnou skutečně mnoho. Ovšem většinou není jejich vytvoření příliš pohodlné a je lepší užít přímo některý shellový nástroj.

Jednořádkové skripty jsou výhodné například při nahrazování textu v souborech nebo když nevíme, jak realizovat daný úkol přímo v shellu. Je to užitečné doplnění technik uživatele příkazového interpretu.

Verze pro tisk

pridej.cz

 

DISKUZE

Nejsou žádné diskuzní příspěvky u dané položky.



Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

3.3.2015 7:15 /MaReK Olšavský
Další kus bývalé Motoroly, Freescale, bude mít nového majitele, jímž se stane nizozemská NXP. Motorola se podílela na PowerPC, ale ještě dříve vyrobila legendární řadu mikroprocesorů 68 0x0, které jsme měli v Amigách, Atari ST, Applech, nebo Sinclairu QL, či prvních stanicích SUN Microsystems.
Přidat komentář

3.3.2015 6:59 /MaReK Olšavský
Firma Epic Games překvapila otevřením Unreal Engine 4 a dalších verzí. Z původní ceny US$ 3000 čtvrtletně, ke zcela otevřeným zdrojovým kódům.
Přidat komentář

2.3.2015 6:58 /MaReK Olšavský
Pomalý vývoj se stal vlastností desktopu Xfce, který byl uvolněn ve verzi 4.12, jež nabízí zcela přepsaný editor Mousepad, podporu vypalování BluRay, nebo počínající podporu GTK3.
Komentářů: 1

2.3.2015 6:58 /MaReK Olšavský
Vyšlo 94. číslo měsíčníku Full Circle Magazine (pdf, ePub), v němž naleznete článek o btrfs, nebo recenzi hry War Thunder.
Přidat komentář

2.3.2015 6:58 /MaReK Olšavský
Klientů pro hlasovou komunikaci je více, než jen obligátní Skype. 4 řešení pro GNU/Linux, bez Skype, připomíná Jack Wallen.
Přidat komentář

27.2.2015 7:20 /MaReK Olšavský
Svobodný databázový projekt RethinkDB není klasickou RDBMS, pro ukládání JSON dokumentů. Na stránkách Opensource.com vyšel rozhovor s Slavou Akhmechetem, zakladatelem RethinkDB.
Přidat komentář

27.2.2015 7:20 /MaReK Olšavský
Intel zjednodušil značení Atomů určených pro mobilní zařícení. Když uživatel uvidí Atom x3 a Atom x7 v popisu zařízení, napoví mu to více o výkonu, než stávající číselné značení (Z3570, Z3770).
Přidat komentář

26.2.2015 7:25 /MaReK Olšavský
Úspěšný výrobce ARM SoC Allwinner významně porušuje GPL „rabováním“ zdrojových kódů.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

3.3.2015 6:54 / MaReK Olšavský
Recenze + instalace

2.2.2015 6:40 / MaReK Olšavský
Re: Churchill

30.1.2015 13:16 / Petr Ježek
Churchill

27.1.2015 12:58 / Ladislav Kulatý
Re: Mazání adřářů v linuxu pro IP kamery

26.1.2015 23:57 / Sinuhed
Re: Mazání adřářů v linuxu pro IP kamery

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2015) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze | zákony online