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 17462×

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ů

24.4.2014 7:06 /MaReK Olšavský
Staré hry (opravdu staré z 80. let 20. století) jsou stále velmi oblíbené a hrajeme je především v emulátorech. Pokud máte rádi takto staré hry a chcete tip na nejbližší dny, určitě i prodloužené víkendy díky svátkům, stojí za povšimnutí distribuce Puppy Arcade 11, která na USB klíčence nabídne emulátory nejběžnějších platforem z éry domácích počítačů, i s dostatečnou zásobou her.
Přidat komentář

24.4.2014 7:06 /MaReK Olšavský
V srpnu 2013 otevřela IBM svou architekturu Power, v rámci OpenPower Foundation, a nyní představila řadu Power serverů, v něž vkládá naděje, pro udržení architektury Power při životě. Servery si pochopitelně rozumí s GNU/Linuxem. BTW: Postrádám jedině verzi v tower-case, jež by vyhovovala menším firmám, které nechtějí (nebo nemají kam postavit) rackovou skříň.
Přidat komentář

24.4.2014 7:06 /MaReK Olšavský
CERN se nemalou měrou podílí na vývoji Sceintific Linuxu (fork RHELu, podobně jako CentOS), přičemž Red Hat je pro CERN důležitou distribucí, na níž běží téměř 600 důležitých serverů.
Přidat komentář

24.4.2014 7:06 /MaReK Olšavský
Aktuální Weekly Feature Digest 26, jenž shrnuje novinky PC-BSD, fakticky ohlašuje práci na novém desktopu (správci oken) Lumina. Je desktopů a správců oken snad málo?
Přidat komentář

23.4.2014 7:29 /MaReK Olšavský
Čínská firma Lemaker představila konkurenci Raspberry Pi, SBC Banana Pi s 2 jádrovými SoC Allwinner A20 (Cortex-A7) o frekvenci 1 GHz, a (konečně) jedním SATA konektorem. GPIO header by měl být kompatibilní s R-Pi i možnosti připojení jsou stejné.
Přidat komentář

23.4.2014 7:29 /MaReK Olšavský
Bezpečnostní chyba „Heartbleed“ v OpenSSL se dostala i do hlavních zpráv světových médií a pravděpodobnost objevení další je nenulová. Naprostá dominance (OpenSSL má téměř monopolní postavení) pak znamená ohrožení opravdu velkého počtu uživatelů. Stávající OpenSSL je vyvíjené dlouhou dobu a Theo de Raadt se rozhodl pro vytvoření forku LibreSSL, který přinese i značné vyčištění API.
Přidat komentář

22.4.2014 6:47 /MaReK Olšavský
Svobodný software a softwarově definované sítě/datacentra se doplňují. O možných změnách stávajících rolí v datacentrech, píše Dan Kusnetzky.
Přidat komentář

22.4.2014 6:47 /MaReK Olšavský
Zatím není úplně jasné, zda je reálné, aby Chromebooky pronikly do enterprise sféry, přestože se Google a Citrix snaží o zpřístupnění kritických aplikací z platformy Windows.
Přidat komentář

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

> Poslední diskuze

7.4.2014 6:31 / MaReK Olšavský
Re: No, nevím

4.4.2014 10:22 / Petr Ježek
No, nevím

4.4.2014 10:18 / Petr Ježek
ATI

24.3.2014 13:54 / Michal Linha
Re: Delimiter

24.3.2014 13:46 / Michal Linha
Re: Delimiter

Více ...

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