280 likes | 405 Vues
Ú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 – http://www.ms.mff.cuni.cz/~forst/) david.hoksza@mff.cuni.cz. standardn í vstup /v ýstup.
E N D
Úvod do UNIXu (4th round) David Hoksza (většina sekce o vi a obrázek na slidu 7 převzat od Libora Forsta – http://www.ms.mff.cuni.cz/~forst/) david.hoksza@mff.cuni.cz
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 < input > 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 • Jaký je rozdíl mezi • cat file >log 2>&1 • cat file 2>&1>log • 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) • 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 • Viz. předchozí, ale vypište pouze jména souborů • 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 • 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 i, a, I, A, o, O, s, S, cx, C, R : <LF>, <Bkspc> <ESC>, (^C) režim vstupu režim příkazů ex ZZ (:)q, (:)x
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<LF>, 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 • [z1z2z3z3] • vyhovuje výskyt libovolného znaku z uvedené množiny • [^z1z2z3z3] • 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 • pattern1(pattern2|pattern3) pattern4 • () 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í emailových adres na řádce • ^[A-Za-z0-9._-]+@[A-Za-z0-9.-]+$ • 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ů • <([A-Z][A-Z0-9]*)\b[^>]*>.*?</\1>
Úkol • 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 • Co je nalezeno výrazem [[]] ? • Vyhledejte všechny čísla v textu • Vyhledejte v textu všechna rodná čísla. • Vyhledejte v textu všechny výskyty IP adres. • Vylepšete příklad s vyhledáním emailových adres, aby rozpoznával v části za @ 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 • Nahraďte všechny výskyty slova black za white • Smažte první 2 řádky souboru • Smažte jednořádkové C komentáře (začínají // a pokračují do konce řádku) • 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) • Vypište do souboru sudy řádky souboru začínající na sudé číslo