čtvrtek 31. prosince 2009

Užitečné příkazy pro Bash terminál

Emulátor terminálu je jedna z mnou nejpoužívanějších aplikací v Ubuntu. Dá se s jeho pomocí často vyřešit problém podstatně rychleji, než pomocí grafické aplikace. Tuhle jsem třeba potřeboval udělat iso obraz CD a zjistil, že vlastně nemám žádný grafický nástroj, který by to uměl. A přitom bylo řešení hned pod nosem: ...



Vytvoření iso obrazu CD/DVD
$ cat /dev/cdrom > myimage.iso
anebo
$ dd if=/dev/cdrom of=myimage.iso
Geniální :)


Jindy jsem si v fstab přejmenoval přístupové body disků v /media a samozřejmě mi přestaly fungovat některé skripty, protože jsem použil pevné cesty k souborům v /home, který jsem měl umísten nestandardně. Použil jsem tedy program sed, abych nefunkční odkazy vyměnil:

Náhrada řetězce v souboru
$ sed -i 's@/media/sdb1/gdh@\~@g' ~/cesta/k/souboru
nebo
$ sed -i 's@/media/sdb1/gdh@\~@g' ~/cesta/k/*
pro všechny soubory v adresáři.

Pro vysvětlení, přepínač -i způsobí, že se změna zapíše rovnou do editovaného souboru, jinak by se výsledek jen vypsal na standardní výstup. Znak "s" za uvozovkou znamená substituci (náhradu) a to řetězce "/media/sdb1/gdh" za "~", tedy symbol pro cestu do domovského adresáře. Zpětná lomítka před speciálními znaky jsou tzv. escape znaky, které zajistí to, že je program nebude interpretovat jako znaky řídící. "g" před koncovou uvozovkou značí, že se substituce provede globálně, tedy nahradí se všechny nalezené řetězce, nejen první. Zavináče jsou použity jako oddělovač, neboli delimiter, místo běžného lomítka, které by se pletlo s lomítky v hledaném výrazu a musely by se zbytečně použít zpětná lomítka jako escape znaky. Jako delimiter můžete použít libovolný znak, ale pokud by jej obsahoval řetězec který, nebo kterým, nahrazujete, musel by být escapován.
Uvedený příkaz v mém případě udělal ze všech výskytů "/media/sdb1/gdh/" univerzálnější "~/" využívající pro cestu k home adresáři proměnnou prostředí $HOME, na něj ukazující.
Pokud chcete udělat úpravu souboru a uložit ji do souboru jiného, změní se příkaz takto:

Náhrada řetězce v souboru a uložení výsledku do souboru jiného
$ sed 's@/media/sdb1/gdh@\~@g' ~/skripty/skript.sh > ~/skripty/skript.sh-new

Náhrada znaků nového řádku mezerami
$ tr "\n" " "
$ sed '{:a;N;s/\n/ /g;t a}'
$ sed ':a;N;$!ba;s/\n/ /g'

Při použití sed je nutno pospojovat po sobě následující řádky příkazem N ve smyčce. Oproti tr kompikované, ale sed zas dává možnost řešit složitější zadání.

Vypsání konce řádku od posledního výskytu zadaného znaku (nebo řetězce)
$ sed 's/^.*\///'

Typicky, potřebujete z cesty k souboru, pouze jeho název - tedy to, co je za posledním lomítkem.
Standardně zapsaný výraz je plný lomítek a pro to hledané je potřeba použít escape znak, což na přehlednosti nepřidá. Je tu ale možnost použít jako delimiter v podstatě libovolný jiný znak, který se nebude plést do hledaného výrazu. Pak to může vypadat lépe:
$ sed 's@^.*/@@'

Nahrazení všech dvou po sobě jdoucích prázdných řádků řetězcem
sed '/^$/N;s/\n$/řetězec/'

Další příklady použití editoru sed jsou třeba zde.

Jednoduchý textový editor pomocí příkazu cat
Pokud potřebujeme rychle vytvořit textový soubor, třeba se skriptem, může se hodit toto rychlé řešení:
$ cat >>soubor<< 'EOF'

Zadání se ukončí sekvencí EOF následovanou Enterem. Pokud již soubor existuje, připojí se vložený text ke stávajícímu obsahu.

Vyhledání řetězce v textovém souboru včetně kontextu
Na vyhledávání řetězců tu máme příkaz grep, k němu zmíním pár základních přepínačů:
-A x  -vypíše krom řádku s hledaným řetězcem, i x řádků za ním
-B x  -vypíše krom řádku s hledaným řetězcem, i x řádků před ním
-C x  -vypíše řádek s hledaným výrazem v kontextu x řádků před, i po něm

$ man grep|grep -A 2 ".-A"
Tento příkaz vypíše třířádkový popis přepínače -A příkazu grep.

Výpis souborů aktuálního adresáře i všech podadresářů, seřazených podle velikosti sestupně:
$ find -type f -exec du -B 1M {} \+|sort -nr|less

přepínač -B v příkazu určuje velikost bloku v bytech, velikost souborů bude udávána v počtu těchto bloků.

Zajímavé kódy sem postupně doplňuji....

2 komentáře:

  1. Doporucuji mrknout i na Terminator - je standartne v Ubuntu a oproti klasickemu terminalu ma veci jako rozdelitelne okno (vertikalne i horizontalne) apod.

    OdpovědětSmazat
  2. Díky za tip, to dělení okna je rozhodně zajímavé, většinou mám těch terminálů otevřeno.. mnoho :)

    OdpovědětSmazat

Zkuste prosím při komentováni používat místo volby Anonymní volbu Název/adresa URL, kde vyplníte nějakou přezdívku, adresu zadávat nemusíte. Vědět, které příspěvky jsou od jednoho člověka, je fajn. Díky.

Pokud by se vám náhodou odeslaný komentář na stránce nezobrazil, vytáhnu ho z koše hned jak si toho všimnu. I Google spam filter se občas sekne.