Úvod do UNIXu (4 th round) David Hoksza (většina sekce o vi a obrázek na slidu 7 převzat od Libora Forsta –
standardní vstup/výstup standardní IO jsou reprezentovány standardními deskriptory souborů (file descriptor), s kterými by měly programy operovat /dev/tty*, /dev/console, /dev/pts/* stdin - 0 (klávesnice), stdout - 1 (obrazovka), stderr -2 (obrazovka) lze přesměrovat odfiltrování chybových hlášek ukládání dlouhého výstupu do souboru potlačení libovolného výstupu předpřipravení vstupu do souboru
přesměrování > přesměruje standardní výstup ls –l > dir_ouput.txt echo “abcd” > /dev/pts/1 echo “abcd” > /dev/null >> při existenci souboru bude proveden append < přesměruje standardní vstup wc –l < /etc/passwd program output lze definovat odkuď kam přesměrovávat make > build_msg 2> error_msg make > build_msg 2>&1
roury vstupy a výstupy programů lze řetězit za pomoci roury (pipe) program1 | program 2 | program 3 |… cat etc/passwd | tail - 10 | tr ‘[:lower:]’ ‘[:upper:]’ | cut –d: -f1
Úkol 1. Jaký je rozdíl mezi cat file >log 2>&1 cat file 2>&1 >log 2. Vypište do souboru všechny uživatele systému setříděné podle abecedy odzadu a k nim jejich skupiny oddělené od sebe tabulátorem (asi budete potřebovat alespoň jeden mezisoubor) 3. Setřiďte na obrazovku soubory v /etc (ne v podadresářích) od souboru s největším počtem řádku k souboru s nejmenším počtem řádků a na výstup vydejte dvojici s informací o jméně a počtu řádek 4. Viz. předchozí, ale vypište pouze jména souborů 5. Viz. předchozí, ale vypište pouze první třiVypište všechny uživatele systému velkými písmeny do souboru a obsahuje-li název písmena, tak je nahraďte za tečky a vypisujte pouze neduplicitní řádky 6. Najděte způsob pro vyprázdnění souboru s tím, že soubor musí zůstat zachována (použijte /dev/null)
Editor vi Visual editor vi [options] [filename] -R read-only (přepisuje pouze je-li “přinucen”) +[N] kurzor bude umístěn na N.tý řádek (poslední – není-li N zadáno) +/pattern kurzor bude umístěn na první výskyt vzoru
Editor vi – schéma práce příkazový režim příkazový režim vstupu režim vstupu režim příkazů ex režim příkazů ex ( : ) q, ( : ) x ZZ i, a, I, A, o, O, s, S, c x, C, R, ( ^C ), :
Editor vi - pohyb šipky, pgDown, pgUP nemusí fungovat na všech systémech a vzdálených konzolích!!! [N]k,[N]j posun o N řádek nahoru/dolu [N]l, [N]h posun o N znaků dopředu/dozadu [N]G posun na N-tou (poslední) řádku [N]H posun na N-tou (první) řádku na obrazovce [N]L posun na N-tou (poslední) řádku na obrazovce od konce mZ označení pozice znakem Z ´Z, `Z skok na místo/začátek řádku pozice Z ´´, ``, skok na místo/začátek řádku poslední pozice
Editor vi – přechod do vstupu i, a, I, A zahájení editace před/za kurzor/řádku (insert, append) R zahájení editace v replace módu o, O zahájení editace po vložení řádky před/za aktuální řádku cc, C zahájení editace po smazání řádky/do konce řádku s, S zahájení editace po smazání znaku/řádku
Editor vi – mazání a práce s buffery x, X smazání textu pod/před kurzorem dd, D smazání řádky/do konce řádky smazaný text se ukládá do očíslovaných bufferů [N]pP vložení N (jednoho) opakování bufferu před/za kurozor “np, “nP vložení n-tého posledního bufferu [“Z]ym vložení textu od kurzoru do místa daného příkazem pro pohyb h do bufferu (pojmenovaného Z) [“Z]yy vložení řádky do bufferu (pojmenovaného Z) “Zp, “ZP vložení bufferu pojmenovaného Z
Editor vi – další příkazy. opakování posledního příkazu u zruší poslední příkazy J spojení řádek ~ zamění velké malé písmeno pod kurzorem rZ změní znak pod kurzorem za Z z, z- posunutí aktuální řádky nahoru/dolu Ctrl+g info o poloze a stavu editovaného souboru % skok na odpovídající závorku
Editor vi – hledání a nahrazení /pattern nalezení vzoru – reguárního výrazu (pohyb pomocí n) /s/a/b/ nahradit výskyt a za b /s/a/b/g nahradit každý (g = global) výskyt a za b /s/a/b/g nahradit každý (g = global) výskyt a za b a každý potvrdit (c = confirmation)
Editor vi - ukončení :q[!] ukončení bez uložení byli-li provedeny změny, pak ! vynutí ukončení bez otázek :x[!] [file_name] ukončení s uložením byli-li provedeny změny při read-only, pak ! vynutí ukončení :w[!] [file_name] uložení byli-li provedeny změny při read-only, pak ! vynutí uložení
grep, egrep Vyhledání regulárního výrazu v řádcích e(xtended)grep umožňuje použití rozšířených regulárních výrazů [e]grep [options] file1 [file2, …] -E egrep -e pattern pattern je hledaný regulární výraz -n před každou řádku její pořadové číslo -r adresáře rekurzivně -w shoda musí být celé slovo -v invert – vyhledá řádky neobsahující slovo vyhovující podmínce -x vyhledá řádky které přesně (jako celek) vyhovují podmínce
Regulární výrazy vyhledávání výrazů odpovídajících vzoru lehká podobnost s * a ? z DOSu vyhledávání s použitím metaznaků, kvantifikátorů, hranic, množin znaků, …
RV – jednoduché vyhledávání z vyhledání výskytů znaku z abcd vyhledání výskytů zřetězení znaků a, b, c, d. zástupný znak za libovolný znak [z 1 z 2 z 3 z 3 ] vyhovuje výskyt libovolného znaku z uvedené množiny [^z 1 z 2 z 3 z 3 ] vyhovuje výskyt libovolného znaku různého od znaků z uvedené množiny [a-zA-Z] vyhovuje libovolnému znaku z rozsahu a-z nebo A-Z \z deaktivuje speciální význam znaku z (například tečky) | operátor nebo pattern 1 (pattern 2 |pattern 3 ) pattern 4 () jsou operátorem “přednosti” [][]
RV - skupiny znaků \d číslice 0-9 \D jakýkoliv znak kromě číslic 0-9 \w znaky „slova” (ekvivalentní zápisu [a-zA-Z0-9]) \W jakýkoliv znak kromě znaků „slova” (ekvivalentní zápisu [^a-zA-Z0-9]) \s „bílé” znaky (mezera, tabulátor, znaky pro zalomení řádků) \S jakýkoliv znak kromě „bílých” znaků [:alnum:] alfanumerický znak (použití grep “\”[[:alnum:]]\”” file) [:space:] mezera [:digit:] číslice
RV - kvantifikátory * minimálně 0krát (maximálně neomezeno) [\]? minimálně 0krát, maximálně 1krát [\]+ minimálně 1krát (maximálně neomezeno) [\]{n [\]} právě nkrát [\]{m,n [\]} minimálně mkrát, maximálně nkrát [\]{m, [\]} minimálně mkrát (maximálně neomezeno) kvantifikátory jsou hladové (zachytí maximální možnou odpovídající sekvenci) někdy lze nastavit líné vyhodnocování použitím otazníku za opakováním x.+?x jistější x[^x]+x
Příklady (jednoduché) cat|dog|mouse|fish colou?r colour, color Set(Value)? Set, SetValue ca*t ct, cat, caat, caaat, ca…….at a\.*z az, a.z, a..z, a….z, a. …..z a\+\+z a++z ab{3,5}c abbbc, abbbbc, abbbbbc.{3,5}pentane cyclopentane, isopentane, neopentane \s[cmt]an\s can, man, tan a[1-4-]z a1z, a2z, a3z, a4z, a-z
RV – výrazy a jejich opakování [\](pattern[\]) uložení patternu do bufferu \N použití N-tého bufferu (abcd)x(ab)\1y\2 ([0-9]{2,4})\.([0-9]{5})xxx\1\*\2
RV - hranice ^ začátek řádku $ konec řádku \b začátek nebo konec slova \< začátek slova \> konec slova
Příklady Nalezení ových adres na řádce Nalezení dosovských cest k programům [A-Z]:(\\[A-Z0-9_]+)+ Nalezení reálných čísel (\+|-)?[1-9][0-9]*(\.[0-9]*)? Nalezení HTML tagů ]*>.*?
Úkol 1. vytvořte textový soubor kde v obsahu bude mimo jiné “x+y=(23*5)” a vytvořte regulární výraz, který najde právě tento výraz 2. Co je nalezeno výrazem [[]] ? 3. Vyhledejte všechny čísla v textu 4. Vyhledejte v textu všechna rodná čísla. 5. Vyhledejte v textu všechny výskyty IP adres. 6. Vylepšete příklad s vyhledáním ových adres, aby rozpoznával v části formát xxx.yyyy (yyyy jsou 2-4 znaky)
sed (1) stream editor čte vstupní proud (defaultně po řádcích) a transformuje ho pomocí regulárních výrazů na výstupní sed format_str file1 [file2 …] sed –r rozšířené regulární výrazy
sed (2) sed ‘s/pat1/pat2/’ file nahradí první výskyt na řádce pat1 za pat2 sed ‘s/[0-9][0-9]*/_/’ file sed "s/function\s* \b\([a-z]*\)\b/#function \1\nfunction \1/g" *.c sed ‘s/pat1/pat2/g’ file dtto golbálně (na všechny výskyty) sed 's/\([a-z]*\)\1/\1/g' sed -n ‘s/pat1/pat2/p’ file -n … na výstup nejdou žádné nové řádky vypisuje pouze řádky obsahující pat1 (zasubstitovanou pat2) sed ‘s/pat1/pat2/w wfile’ file dtto do souboru wfile akce lze kombinovat sed –n ‘s/pat1/pat2/gw wfile’ file
sed (3) složení příkazů sed -e 's/a/A/' -e 's/b/B/' file smazání řádky s výrazem sed ‘/pat/ d’ file obecně lze sed ‘/pat/ action’ file přidání řádky před/za/místo řádky s výrazem sed ‘/pat/ i new line text’ file sed ‘/pat/ a new line text’ file sed ‘/pat/ c new line text’ file
sed (4) – omezení řádků omezení na 1 řádku sed “14 s/pat1/pat2/” file omezení na množinu řádku sed “4,100 s/pat1/pat2/g” file omezení řádek výrazy sed “/start/,/stop/ s/pat1/pat2/” file sed “/start/,/stop/ d” file transforamce sed '/\d\d*/ y/abc/ABC' file
Úkol 1. Nahraďte všechny výskyty slova black za white 2. Smažte první 2 řádky souboru 3. Smažte jednořádkové C komentáře (začínají // a pokračují do konce řádku) 4. Viz. předchozí, ale pokud komentář začína na začátku řádky, tak také smazat danou řádku (tj. po minulém příkladě můžou zbýt prázdné řádky a tyto odstranit) 5. Vypište do souboru sudy řádky souboru začínající na sudé číslo