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 25233×
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
|
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ů
28.11.2018 23:56 /František Kučera Prosincový sraz spolku OpenAlt se koná ve středu 5.12.2018 od 16:00 na adrese Zikova 1903/4, Praha 6. Tentokrát navštívíme organizaci CESNET. Na programu jsou dvě přednášky: Distribuované úložiště Ceph (Michal Strnad) a Plně šifrovaný disk na moderním systému (Ondřej Caletka). Následně se přesuneme do některé z nedalekých restaurací, kde budeme pokračovat v diskusi.
Komentářů: 1
12.11.2018 21:28 /Redakce Linuxsoft.cz 22. listopadu 2018 se koná v Praze na Karlově náměstí již pátý ročník konference s tématem Datová centra pro business, která nabídne odpovědi na aktuální a často řešené otázky: Jaké jsou aktuální trendy v oblasti datových center a jak je optimálně využít pro vlastní prospěch? Jak si zajistit odpovídající služby datových center? Podle jakých kritérií vybírat dodavatele služeb? Jak volit vhodné součásti infrastruktury při budování či rozšiřování vlastního datového centra? Jak efektivně datové centrum spravovat? Jak co nejlépe eliminovat možná rizika? apod. Příznivci LinuxSoftu mohou při registraci uplatnit kód LIN350, který jim přinese zvýhodněné vstupné s 50% slevou.
Přidat komentář
6.11.2018 2:04 /František Kučera Říjnový pražský sraz spolku OpenAlt se koná v listopadu – již tento čtvrtek – 8. 11. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma umění a technologie, IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
4.10.2018 21:30 /Ondřej Čečák LinuxDays 2018 již tento víkend, registrace je otevřená.
Přidat komentář
18.9.2018 23:30 /František Kučera Zářijový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 20. 9. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
9.9.2018 14:15 /Redakce Linuxsoft.cz 20.9.2018 proběhne v pražském Kongresovém centru Vavruška konference Mobilní řešení pro business.
Návštěvníci si vyslechnou mimo jiné přednášky na témata: Nejdůležitější aktuální trendy v oblasti mobilních technologií, správa a zabezpečení mobilních zařízení ve firmách, jak mobilně přistupovat k informačnímu systému firmy, kdy se vyplatí používat odolná mobilní zařízení nebo jak zabezpečit mobilní komunikaci.
Přidat komentář
12.8.2018 16:58 /František Kučera Srpnový pražský sraz spolku OpenAlt se koná ve čtvrtek – 16. 8. 2018 od 19:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát jsou tématem srazu databáze prezentaci svého projektu si pro nás připravil Standa Dzik. Dále bude prostor, abychom probrali nápady na využití IoT a sítě The Things Network, případně další témata.
Přidat komentář
16.7.2018 1:05 /František Kučera Červencový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 7. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát bude přednáška na téma: automatizační nástroj Ansible, kterou si připravil Martin Vicián.
Přidat komentář
Více ...
Přidat zprávičku
 Poslední diskuze
31.7.2023 14:13 /
Linda Graham iPhone Services
30.11.2022 9:32 /
Kyle McDermott Hosting download unavailable
13.12.2018 10:57 /
Jan Mareš Re: zavináč
2.12.2018 23:56 /
František Kučera Sraz
5.10.2018 17:12 /
Jakub Kuljovsky Re: Jaký kurz a software by jste doporučili pro začínajcího kodéra?
Více ...
|