Vstup a výstup procesů, přesměrování

Z MiS
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
(Filtr cut: Doplněna kapitolka)
(Filtry: Přidán popis a přepínač -n k sort)
 
(Není zobrazeno 16 mezilehlých verzí od 1 uživatele.)
Řádka 1: Řádka 1:
[[Category:VSE]][[Category:Informatika]][[Category:Linux]][[Category:OSY]]
+
[[Category:VSE]][[Category:Informatika]][[Category:Linux]][[Category:OSY]][[Category:Příkazový řádek]]
  
 
<div class="Motto">
 
<div class="Motto">
Řádka 57: Řádka 57:
 
; Propojení programů
 
; Propojení programů
 
* <tt>program1 '''|''' program2</tt>
 
* <tt>program1 '''|''' program2</tt>
*: Roura (anglicky pipe). Slouží k propojení dvou procesů. Je to tedy vlastně nástroj pro komunikaci mezi procesy.
+
*: Roura (anglicky ''pipe''). Slouží k propojení dvou procesů. Je to tedy vlastně nástroj pro komunikaci mezi procesy.
*: Spustí se <tt>program2</tt>. Jako vstup dostane „konec roury“ (anglicky pipe). Pak se spustí program <tt>program1</tt>. Výstup z programu <tt>program1</tt> se posílá do „roury“ a <tt>program2</tt> ho dále zpracovává.
+
*: Spustí se <tt>program2</tt>. Jako vstup dostane „výstup z&nbsp;roury“. Pak se spustí program <tt>program1</tt>. Výstup z&nbsp;programu <tt>program1</tt> se posílá do „roury“ jako „vstup roury“ a rourou se posílá ke zpracování programu <tt>program2</tt>.
 
  ls | sort | head
 
  ls | sort | head
 
  cat /etc/passwd | cut -d : -f 1 | sort
 
  cat /etc/passwd | cut -d : -f 1 | sort
 +
* Propojením několika programů pomocí roury vznikne ''kolona příkazů'' (anglicky ''pipeline'').
  
 +
<div class="Poznamka">Poznámka: Funkci použitých příkazů najdete v kapitole [[#Filtry]].</div>
  
 
; Další příklady
 
; Další příklady
Řádka 69: Řádka 71:
 
  cat /proc/meminfo | grep Free
 
  cat /proc/meminfo | grep Free
 
  cat /etc/passwd | grep student
 
  cat /etc/passwd | grep student
 
  
 
== Speciální soubory ==
 
== Speciální soubory ==
Řádka 86: Řádka 87:
  
 
== Filtry ==
 
== Filtry ==
Jako filtr označujeme program, který čte data ze standardního vstupu a zapisuje výsledky na standardní výstup. Typické unixové programy se tedy chovají jako filtry.
+
Jako ''filtr'' označujeme program, který čte data ze standardního vstupu a zapisuje výsledky na standardní výstup. Typické unixové programy se chovají jako filtry.
  
 
* <code>cat</code>... čte vstup a opisuje data na výstup
 
* <code>cat</code>... čte vstup a opisuje data na výstup
* <code>grep</code>... čte vstup a opisuje na výstup jen řádky obsahující parametr. Viz [[#Filtr grep|samostatná kapitolka]].
+
* <code>grep</code>... čte vstup a opisuje na výstup jen řádky obsahující posloupnost znaků, zadanou jako parametr. Viz [[#Filtr grep|samostatná kapitolka]].
 +
* <code>sed</code>... umí nahradit zadanou posloupnost znaků ve vstupu jinou posloupností (podobně jako nahrazování v&nbsp;textových editorech).
 +
** Viz například: [https://linuxconfig.org/learning-linux-commands-sed LinuxConfig.org &rarr; Learning Linux Commands: Sed].
 
* <code>less</code>... stránkování výstupu, ukončujeme stiskem „q“
 
* <code>less</code>... stránkování výstupu, ukončujeme stiskem „q“
 
  tar --help | less
 
  tar --help | less
 
* <code>head</code>... opíše na výstup jen prvních několik řádek vstupu
 
* <code>head</code>... opíše na výstup jen prvních několik řádek vstupu
 +
** Bez přepínačů uvede prvních 10 řádků. Přepínačem můžeme stanovit, kolik řádků se má opsat na výstup.
 +
head /proc/meminfo
 
  head -n 1 /proc/meminfo
 
  head -n 1 /proc/meminfo
 +
head -5 /proc/meminfo
 
* <code>tail</code>... opíše na výstup jen posledních několik řádek vstupu
 
* <code>tail</code>... opíše na výstup jen posledních několik řádek vstupu
 +
** Stejně jako u&nbsp;filtru <code>head</code> je výchozí hodnota 10 řádků a pomocí přepínače <code>-n</code> můžeme specifikovat počet opsaných řádků.
 
  tail /var/log/apache2/error_log
 
  tail /var/log/apache2/error_log
 +
tail -5 /var/log/apache2/error_log
 +
tail -n 8 /var/log/apache2/error_log
 
* <code>wc -l</code>... spočte počet řádek vstupu
 
* <code>wc -l</code>... spočte počet řádek vstupu
 
  ls | wc -l
 
  ls | wc -l
Řádka 105: Řádka 114:
 
  tar -xzf archiv.tar.gz
 
  tar -xzf archiv.tar.gz
 
* <code>unzip</code>... dekomprimuje data ze vstupu (metoda ZIP)
 
* <code>unzip</code>... dekomprimuje data ze vstupu (metoda ZIP)
* <code>sort</code>
+
* <code>cut</code>... vybere jen některé sloupce z&nbsp;tabulky. Viz [[#Filtr cut|samostatná kapitolka]].
  cat /etc/passwd | cut -d : -f 1,5 | sort
+
* <code>sort</code>... seřadí řádky podle abecedy
* <code>cut</code>... vybere jen některé sloupce z&nbsp;tabulky. Viz [[#Filtr <code>cut</code>|samostatná kapitolka]].
+
** Můžete použít také přepínače:
 +
** <code>sort -r</code>... sestupné pořadí (od Z k&nbsp;A)
 +
** <code>sort -n</code>... řadí číselné hodnoty (případně <code>-g</code> čísla mohou být ve veděckém formátu)
 +
  head /etc/passwd | sort
 +
cut -d : -f 3,4 /etc/group | sort -nr
 +
* <code>nl</code>... očísluje řádky výstupu (šikovné u zdrojových kódů skriptů).
 
* <code>tee</code>... opisuje vstup na obrazovku i do souboru či do dvou souborů
 
* <code>tee</code>... opisuje vstup na obrazovku i do souboru či do dvou souborů
 
  $ date | tee file1 file2   
 
  $ date | tee file1 file2   
Řádka 113: Řádka 127:
 
  $ cat file1   
 
  $ cat file1   
 
  Thu Jun 10 11:10:34 CEST 2004
 
  Thu Jun 10 11:10:34 CEST 2004
* <code>unique</code>... filtruje duplicitní řádky ze vstupu.
+
* <code>uniq</code>... filtruje po sobě následující duplicitní řádky ze vstupu.
 
* <code>tr</code>.. (''TRanslate'')
 
* <code>tr</code>.. (''TRanslate'')
 
** Nahrazuje ve vstupu zadané znaky jinými (podle tabulky) a vypisuje na výstup.
 
** Nahrazuje ve vstupu zadané znaky jinými (podle tabulky) a vypisuje na výstup.
  
 +
; Úkoly:
 +
* Vypište druhý řádek ze souboru <code>/proc/meminfo</code>.
  
 
== Hrátky &mdash; filtr <tt>cat</tt>;) ==
 
== Hrátky &mdash; filtr <tt>cat</tt>;) ==
  
 
* Program <code>cat</code> vlastně jen kopíruje data ze vstupu na výstup.
 
* Program <code>cat</code> vlastně jen kopíruje data ze vstupu na výstup.
* Pokud mu navíc zadáme jako parametr název souboru, čte data z tohoto souboru.
+
* Pokud mu navíc zadáme jako parametr název souboru, čte data z&nbsp;tohoto souboru.
  
 
* Zamyslete se, co bude dělat, a vyzkoušejte:
 
* Zamyslete se, co bude dělat, a vyzkoušejte:
Řádka 142: Řádka 158:
 
; Příklady použití:
 
; Příklady použití:
 
  ls | grep a.[0-9]\.jpg
 
  ls | grep a.[0-9]\.jpg
* Akceptuje soubory: <tt>ab.jpg</tt>, <tt>a19.jpg</tt>, <tt>az0.jpg</tt>, <tt>a.0.jpg</tt>  
+
* Akceptuje soubory: <tt>ab3.jpg</tt>, <tt>a19.jpg</tt>, <tt>az0.jpg</tt>, <tt>a.0.jpg</tt>  
* Ale neakceptuje soubory: <tt>a.jpg</tt>, <tt>a1u.jpg</tt>, <tt>a19.jpg</tt>, <tt>a.72jpg</tt>
+
* Ale neakceptuje soubory: <tt>ab.jpg</tt>, <tt>a.jpg</tt>, <tt>a1u.jpg</tt>, <tt>a9i.jpg</tt>, <tt>a.72jpg</tt>
  
Více viz třeba: [http://www.regularnivyrazy.info/regularni-vyrazy-zaklady.html#.VNMYomOb_q8 Regulární výrazy.info]
+
; Úkoly
 +
* Vypište ze souboru <code>/etc/passwd</code> řádek, který se týká aktuálně přihlášeného uživatele.
 +
 
 +
<div class="Poznamka">Pokus potřebujete vzory nahradit jinými, můžete využít <code>sed</code>.</div>
  
 
== Filtr <code>cut</code> ==
 
== Filtr <code>cut</code> ==
Řádka 172: Řádka 191:
  
  
== Vyzkoušejte si ==
+
== Cvičení &mdash; vyzkoušejte si! ==
* Vypište obsah adresáře do souboru <tt>vypis.txt</tt>.
+
* Vypište obsah aktuálního adresáře do souboru <tt>vypis.txt</tt>.
* Spočtěte, kolik souborů a složek je v adresáři.
+
* Spočtěte, kolik souborů a složek je v podadresáři <tt>etc</tt> kořenového adresáře.
* V předchozím úkolu zahrňte jen soubory obsahující písmeno ''w''.
+
* V předchozím úkolu zahrňte jen soubory obsahující v&nbsp;názvu písmeno ''w''.
* Výsledek předchozího úkolu připojte na nový rádek do souboru <tt>vypis.txt</tt>.
+
* Výsledek předchozího úkolu připojte na nový řádek do souboru <tt>vypis.txt</tt>.
 
* Zobrazte seznam souborů v adresáři <tt>/bin</tt>. Pokud se výpis nevleze na obrazovku, zařiďte, aby se vypsala jen první obrazovka a výpisem šlo listovat (nahoru, dolů, o celé stránky, vyhledávat).
 
* Zobrazte seznam souborů v adresáři <tt>/bin</tt>. Pokud se výpis nevleze na obrazovku, zařiďte, aby se vypsala jen první obrazovka a výpisem šlo listovat (nahoru, dolů, o celé stránky, vyhledávat).
* Vypište uživatelská jména uživatelů registrovaných v systému s GNU/Linuxem. Každé jméno na jeden řádek.
+
* Vypište posledních 5&nbsp;souborů podle abecedy z&nbsp;podadresáře <tt>proc</tt> kořenového adresáře.
 +
* Vypište ty řádky souboru <tt>cpuinfo</tt> podadresáře <tt>proc</tt> kořenového adresáře, které obsahují slovo ''model''.
 +
* Vypište uživatelská jména uživatelů registrovaných v systému s GNU/Linuxem. Každé jméno na jeden řádek. Jména seřaďte podle abecedy sestupně.
 +
* Vypište třetí, čtvrtý, pátý a šestý řádek souboru <tt>.bash</tt> v&nbsp;domovském adresáři uživatele. Ostatní řádky ignorujte.
 +
<div class="Poznamka">Řešení cvičení najdete úplně na konci textu.</div>
  
  
 
== Úkoly ==
 
== Úkoly ==
# Proč nefunguje tento postup? Opravte:
+
; Úkol 1. &mdash; Formátovaný výstup:
#* Výběr uživatelů se správnou doménou:
+
* Napište posloupnost příkazů, která vytvoří soubor ve tvaru:
 +
*# Několik pomlček
 +
*# Text <code>"Adresář:"</code>
 +
*# Cesta k aktuálnímu adresáři
 +
*# Text <code>"Obsahuje soubory:"</code>
 +
*# Výpis souborů, které jsou v aktuálním adresáři.
 +
* Příklad výstupu:
 +
---------------
 +
Adresář:
 +
''/home/student''
 +
obsahuje soubory:
 +
''Desktop''
 +
''Downloads''
 +
''a.txt''
 +
----------------
 +
 
 +
; Úkol 2. &mdash; Špatné filtrování?
 +
* Chci vybrat z textového souboru uživatele s jednou konkrétní doménou (<code>seznam.cz</code>).
 +
* Proč nefunguje tento postup:
 
  echo Eduard; Karásek; karaed@seznam.cz; 48 > data.txt
 
  echo Eduard; Karásek; karaed@seznam.cz; 48 > data.txt
 
  echo Karel; Seznamicz; karel@seznamicz.cr; 25 >> data.txt
 
  echo Karel; Seznamicz; karel@seznamicz.cr; 25 >> data.txt
 
  echo Jana; Dolanská; dolanska@centrum.cz; 37 >> data.txt
 
  echo Jana; Dolanská; dolanska@centrum.cz; 37 >> data.txt
 +
 
  cat data.txt | grep @seznam.cz
 
  cat data.txt | grep @seznam.cz
 +
* Opravte příkazy!
 +
 +
 +
== Řešení cvičení ==
 +
ls > vypis.txt
 +
ls /etc | wc -l
 +
ls /etc | grep w | wc -l
 +
ls /etc | grep w | wc -l >> vypis.txt
 +
ls /bin | less
 +
ls /proc | sort | tail -5
 +
cat /proc/cpuinfo | grep model
 +
cat /etc/passwd | cut -d : -f 1 | sort -r
 +
head -6 ~/.bash_history | tail -3
 +
 +
== Související stránky ==
 +
* [[Regulární výrazy]]
  
  
 
== Zdroje ==
 
== Zdroje ==
 
* [http://www.codecoffee.com/tipsforlinux/articles2/042.html codecoffee.com > Tips for Linux > Input/Output Redirection in Unix]
 
* [http://www.codecoffee.com/tipsforlinux/articles2/042.html codecoffee.com > Tips for Linux > Input/Output Redirection in Unix]
 +
* [https://linuxconfig.org/learning-linux-commands-sed LinuxConfig.org &rarr; Learning Linux Commands: Sed]

Aktuální verze z 19. 12. 2023, 07:42


„Write programs that do one thing and do it well.
  Write programs to work together.
  Write programs that handle text streams, because that is an universal interface.“

       Douglas McIlroy


Obsah

K čemu je přesměrování vstupů?


Procesy v Unixu a Linuxu

Přesměrování vstupů je vlastně způsob komunikace mezi procesy. Proces si můžeme představit jako černou skříňku s:

Vstup a výstup programů pak můžeme navzájem propojit.


Varianty přesměrování

Přesměrování standardního výstupu do souboru
ls -l > ~/obsah_adresare.txt
echo "Druhy adresar:" >> ~/obsah_adresare.txt
ls druhy -l >> ~/obsah_adresare.txt


Přesměrování chybového výstupu do souboru
cp a b 2> /dev/null
mv archiv.tar.gz zalohy 2> ~/zaloha_chyby.log


Přesměrování standardního vstupu


Propojení programů
ls | sort | head
cat /etc/passwd | cut -d : -f 1 | sort
Poznámka: Funkci použitých příkazů najdete v kapitole #Filtry.
Další příklady
cat /proc/meminfo
cat /proc/meminfo | head
cat /proc/meminfo | head -n 1 > memory.txt
cat /proc/meminfo | grep Free
cat /etc/passwd | grep student

Speciální soubory

Virtuální soubory reprezentující standardní vstup a výstup
Pomocné
cp ~/ahoj.txt /home/student/ahoj.txt 2> /dev/null

Viz také: Významné složky GNU/Linuxu.


Filtry

Jako filtr označujeme program, který čte data ze standardního vstupu a zapisuje výsledky na standardní výstup. Typické unixové programy se chovají jako filtry.

tar --help | less
head /proc/meminfo
head -n 1 /proc/meminfo
head -5 /proc/meminfo
tail /var/log/apache2/error_log
tail -5 /var/log/apache2/error_log
tail -n 8 /var/log/apache2/error_log
ls | wc -l
tar -c * | gzip > archiv.tar.gz
tar -czf archiv.tar.gz *
tar -xzf archiv.tar.gz
head /etc/passwd | sort
cut -d : -f 3,4 /etc/group | sort -nr
$ date | tee file1 file2   
Thu Jun 10 11:10:34 CEST 2004
$ cat file1   
Thu Jun 10 11:10:34 CEST 2004
Úkoly

Hrátky — filtr cat;)

cat
cat > /dev/stdout
cat > pokus.txt
cat /dev/stdin
cat < /etc/passwd


Filtr grep

Příklady použití
ls | grep a.[0-9]\.jpg
Úkoly
Pokus potřebujete vzory nahradit jinými, můžete využít sed.

Filtr cut

Parametry
-d :
-f 1,3
Příklad
cut /etc/passwd -d : -f 1,6

Zopakujte si


Cvičení — vyzkoušejte si!

Řešení cvičení najdete úplně na konci textu.


Úkoly

Úkol 1. — Formátovaný výstup
---------------
Adresář:
/home/student
obsahuje soubory:
Desktop
Downloads
a.txt
----------------
Úkol 2. — Špatné filtrování?
echo Eduard; Karásek; karaed@seznam.cz; 48 > data.txt
echo Karel; Seznamicz; karel@seznamicz.cr; 25 >> data.txt
echo Jana; Dolanská; dolanska@centrum.cz; 37 >> data.txt

cat data.txt | grep @seznam.cz


Řešení cvičení

ls > vypis.txt
ls /etc | wc -l
ls /etc | grep w | wc -l
ls /etc | grep w | wc -l >> vypis.txt
ls /bin | less
ls /proc | sort | tail -5
cat /proc/cpuinfo | grep model
cat /etc/passwd | cut -d : -f 1 | sort -r
head -6 ~/.bash_history | tail -3

Související stránky


Zdroje

Osobní nástroje
Jmenné prostory
Varianty
Akce
Výuka
Navigace
Nástroje