Portál AbcLinuxu, 8. května 2024 01:23

BASH - V

21. 11. 2003 | Jan Fuchs
Články - BASH - V  

V předposlední části seriálu si ukážeme, jak pracovat s dokumenty here, metaznaky shellu, regulárními výrazy, filtry a proudovými editory.

Obsah jednotlivých dílů

  1. Úvod, editace příkazové řádky
  2. Základní příkazy, roury a přesměrování
  3. Proměnné, podmínky a cykly
  4. Funkce a příkazy
  5. Dokumenty here, regulární výrazy
  6. Ladění skriptů, odchytávání signálů a příklady

Dokumenty here

Umožňují předat vstup příkazu ze samotného skriptu. Ukážeme si to na skriptu here.sh.

#!/bin/bash

cat <<EOF
\$USER=$USER
\$HOME=$HOME
\$SHELL=$SHELL
EOF

cat <<"EOF" | egrep 'J|u'
Jestliže nechceme expandovat proměnné, uzavřeme příznak určující konec vstupu do uvozovek ($USER, $HOME, $SHELL).
EOF

exit 0

Ještě si skript spustíme.

# ./here.sh $USER=root
$HOME=/root
$SHELL=/bin/bash
Jestliže nechceme expandovat proměnné, uzavřeme příznak určující konec vstupu do uvozovek ($USER, $HOME, $SHELL).

Metaznaky shellu

Lze je použít k neúplnému zadání jména souboru.

POZOR neztotožňujte metaznaky shellu s regulárními výrazy, jsou to dvě různé věci. Metaznaky expanduje přímo shell. A proto když chceme nějakému programu předat regulární výraz, musíme ho uzavřít například do apostrofů.

První příkaz smaže zálohy souborů (soubory končící na ~). Znak ~ nebude v tomto případě expandován.

$ rm *~
$ ls dil*.html
dil2.html  dil3.html  dil4.html  dil5.html  dil6.html
$ ls [di]*.html
dil2.html  dil3.html  dil4.html  dil5.html  dil6.html  index.html

Regulární výrazy

Jsou (mými slovy, přesná definice je "trochu" složitější :-D) vzory, s jejichž pomocí lze definovat společné rysy několika různých řádků a tím pádem je reprezentovat jako jeden regulární výraz. Níže uvedené speciální znaky jsou použitelné např. v grep, egrep, sed, ed, ex, awk.

Použijeme programy cat, grep a všechno si poctivě vyzkoušíme.

$ cat << END > ./retezce.txt
> abclinuxu
> alfa
> aaa
> abcabcabc
> znak $
> a1a
> aAa
> END
$ cat ./retezce.txt | grep '.*'
abclinuxu
alfa
aaa
abcabcabc
znak $
a1a
aAa
$ cat ./retezce.txt | grep '.* \$'
znak $
$ cat ./retezce.txt | grep '^a[a-z]*a$'
alfa
aaa
$ cat ./retezce.txt | grep '^a[a-z0-9]*a$'
alfa
aaa
a1a

Filtry

Jsou programy, které ze vstupu podle zadaného vzoru odfiltrují jen námi požadovaná data a pošlou je na výstup. Jsou jimi např. grep, egrep (grep -E) a fgrep (grep -F), jsou to vlastně stejné programy. Pro nás je důležité, že grep používá pro zápis regulárních výrazů starší notaci a egrep naopak novější notaci. Níže uvedené speciální znaky patří do novější notace a chceme-li je použít ve filtru grep, musíme před ně zapsat znak \.

Pro lepší pochopení uvedu opět několik příkladů.

$ cat ./retezce.txt | grep '^a\+$'
aaa
$ cat ./retezce.txt | egrep '^a+$'
aaa
$ cat ./retezce.txt | egrep '^abcl?'
abclinuxu
abcabcabc
$ cat ./retezce.txt | egrep '^c|z'
znak $
$ cat ./retezce.txt | egrep '(abc)+'
abclinuxu
abcabcabc
$ cat ./retezce.txt | egrep '^(.*)\1\1$'
aaa
abcabcabc
$ cat ./retezce.txt | egrep '^a{3}$'
aaa
$ cat ./retezce.txt | egrep '^a{2,}$'
aaa
$ cat ./retezce.txt | egrep '^a{1,3}$'
aaa

Proudové editory

Z názvu je zřejmé, že slouží k proudové editaci dat. O načítání vstupu se starají sami. Mají k dispozici sadu příkazů, pomocí které data upravují (obvykle pracují s jedním řádkem), např. sed a nebo na složitější věci awk.

Sed

Syntaxe příkazu:

Začátek,Konec!InstrukceArgumenty

Není-li uveden Začátek a Konec, aplikuje se instrukce na každý vstupní řádek. Je-li uveden pouze Začátek, aplikuje se instrukce pouze na odpovídající řádek (či řádky) a je-li uvedeno obojí, tak od řádku odpovídajícímu Začátek se budou aplikovat instrukce a od řádku odpovídajícímu Konec se aplikovat přestanou. Níže jsou uvedeny některé Instrukce a jejich Argumenty.

$ cat ./retezce.txt | sed '2,$s/a/?/g'
abclinuxu
?lf?
???
?bc?bc?bc
zn?k $
?1?
?A?
$ cat ./retezce.txt | sed -n '2p'
alfa
$ cat ./retezce.txt | sed -n '1{
> n
> p
> }'
alfa
$ cat ./retezce.txt | sed '2p
> d'
alfa
$ cat ./retezce.txt | sed '4y/a/?/
> 4!d'
?bc?bc?bc

Na závěr uvedu ještě jeden příklad ve formě skriptu sed.sh.

#!/bin/bash

spojka="je bydliště"
cat <<EOF | sed \
"s/^\(.\+j\) \(.\+\)o:\(.\+\)\$/\3 $s \1e \2a/
 t
 s/^\(.\+j\) \(.\+\):\(.\+\)\$/\3 $s \1e \2a/
 t
 s/^\(.\+\) \(.\+\)o:\(.\+\)\$/\3 $s \1a \2a/
 t
 s/^\(.\+\) \(.\+\):\(.\+\)\$/\3 $s \1a \2a/"
Petr Novák:Praha
Viktor Igo:Brno
Blažej Vodník:Plzeň
Jan Hugo:Hradec Králové
Metoděj Sporák:Ostrava
EOF

exit 0

Výstup skriptu vypadá následovně.

$ ./sed.sh
Praha je bydliště Petra Nováka
Brno je bydliště Viktora Iga
Plzeň je bydliště Blažeje Vodníka
Hradec Králové je bydliště Jana Huga
Ostrava je bydliště Metoděje Sporáka

V případě, že bychom chtěli zajistit správné skloňování úplně pro všechny jména a přijmení, určitě by výše uvedené řešení nebylo to nejkratší a nejvhodnější, berte ho pouze jako ukázku.

Seriál BASH (dílů: 6)

První díl: BASH - I, poslední díl: BASH - VI.
Předchozí díl: BASH - IV
Následující díl: BASH - VI

Související články

BASH - I
BASH - II
BASH - III
BASH - IV
BASH - VI

Odkazy a zdroje

BASH - GNU Project

Další články z této rubriky

VDR a DVB-T2, část 2.
VDR a DVB-T2, část 1.
Šifrovaný Proxmox VE 6: ZFS, LUKS, systemd_boot a Dropbear
MapTiler – proměňte obrázek v zoomovatelnou mapu
Syncthing

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.