MFF Notebook > Unix > Příkazy

Příkazy

Příklady jednoduchých i složených příkazů v shellu Bash s popisem chování.

PříkazPopis
#!/bin/bashskript se bude provádět v shellu Bash
x="ahoj"BEZ MEZER !!!
echo $xecho není filtr
$USERsystémová proměnná - jméno uživatele
CTRL+Zukončí proces
CTRL+DEOF (end of file) - ukončí vstup
CTRL+Czabije proces
CTRL+Vkdyž chci napsat v shellu tabelátor nebo znak nového řádku, stisknu CTRL+V a stisknu tabelátor / enter
teetéčko - rozdvojí vstup
diff abc defrozdíl souborů
-b ignoruje white space
-i ignoruje case
$?výsledek posledního příkazu
ps -ef –fběžící procesy
$0název příkazu
$1 $2 …parametry
shiftsmaže první parametr a ostatní posune doleva
expr 5 % 2matematický výraz
seq 10 | xargs echo
seq 10 | xargs -i echo x{}xvypíše x1x, x2x, x3x, ...
alias tree="ls -R | grep \":$\" | sed -e 's/:$//' -e 's/[^-][^\/]*\//--/g' -e 's/^/   /' -e 's/-/|/'"nastaví posloupnost příkazů pod alias tree
setvypíše seznam proměnných
Filesystem
touch filevytvoří prázdný soubor "file"
> filevytvoří prázdný soubor "file"
rm "file"smaže soubor "file"
mkdir DDDvytvoří adresář "DDD"
mkdir -p a/b/cvytvoří adresář "a" a v něm "b" a v něm "c"
rm -r DDDsmaže adresář "DDD"
rm –rfsmaže adresář, případně si zvýší práva!
rm –iptá se na smazání
mv 1.txt 2.txt notespřesune soubory 1.txt a 2.txt do adresáře notes
mvna přejmenovaní se používá příkaz mv, ne rename
mkdir xxx 2>/dev/null && touch xxx/yyy || echo chyba- vytvoří adresář xxx, pokud se to povede, založí v něm soubor yyy, pokud ne, vypíše se chyba
- přesměrování chybových hlášek se provádí tak, že po příkazu následuje 2>/dev/null
ls BIGseznam souborů v adresáři BIG
touch -d "2008-03-23" abcdzmění datum změny obsahu souboru abcd
ls -lmodifed time
ls -lulast access - to, co změní touch
ls -lcchange time
echo abcd | wc –cvrátí délku souboru
cp -r `cat file.txt` "$DIR"překopíruje soubory a obsah adresářů uvedených v souboru files.txt do existujícího adresáře uvedeného v proměnné DIR
ln -s /etc/passwd ~/passwdvytvoří v domovském adresáři symbolický link na soubor /etc/passwd
ln /etc/passwd ~/passwdvytvoří v domovském adresáři hardlink na soubor /etc/passwd
wc -c *- vypíše velikosti souborů a adresářů
- velikost v prvním sloupci, název souboru či adresáře ve sloupci druhém, oddělovač mezera
echo *vypíše seznam všech souborů a adresářů v současném adresáři (na řádek, oddělovač mezera)
chmod u=rwx,g=rx,o=rx script.shsouboru script.sh nastaví práva:
- User: Read, Write, eXecute
- Group: Read, eXecute
- Others: Read, eXecute
chmod u=rwx,go=rx script.sh-||-
chmod g+rwx script.shsouboru script.sh přidá práva read, write, execute pro group
chmod go-w script.shsouboru script.sh odebere právo write pro group
chmod g+x internaladresář internal se může objevit v cestě k souboru u skupiny
chmod go+rx sharednad adresářem shared se může vykonat výpis souborů
chmod go+rwx publicv adresáři public se můžou vytvářet a mazat soubory
Čtení a zápis
echo "hello" > abcduloží do souboru abcd řetězec "hello"
cat < /etc/passwdčte ze souboru /etc/passwd
cat < /etc/passwd > xxxkopíruje soubor /etc/passwd do souboru xxx
cat a b c d > dspojí soubory a b c do d
Filtry
cat -nvypíše obsah souboru a očísluje řádky
head -10jen prvních 10 řádků
head -n 10-||-
tail -n 1poslední řádek
head -n 13 /etc/passwd | tail -n 1vypíše 13. řádku ze souboru /etc/passwd
head 13 /etc/passwd | tail 1-||-
cut -c1 /etc/passwdvypíše první písmena v řádku v souboru /etc/passwd
cut -c5--||- od pátého znaku do konce
cut -c1-3-||- první až třetí znak
echo "a:b:c" | cut -f2 -d :- vypíše b
- rozdělí na pole, položky oddělené dvojtečkou, vypíše 2. položku
cut -f1,4 -d : /etc/passwdvrátí první a čtvrtý sloupec (sloupce oddělené dvojtečkou) z /etc/passwd
echo hello | tr a-z A-Zvypíše HELLO
echo hello | tr [:lower:] [:upper:]vypíše HELLO
[:digit:] [:alpha:] [:print:] - nezávislé na kódování
echo xaaay | tr -s a bvypíše aby (znaky a nahradí za b a smrskne je)
echo xcabyz | tr -d abcvypíše xyz (odebere znaky a,b,c)
echo abc123efg | tr -c [:digit:] xvypíše xxx123xxx (pouze pro jeden nahrazovací znak)
echo a     b          c | tr -s " " " "vypíše a b c - zruší vícenásobné výskyty mezer
echo a b c | tr ' ' '\n'vypíše na 3 řádky a b c
cat rfc791.txt | tr A-Z a-z | tr -cs [:alpha:] "\n" | sort -u | wc –lvypíše počet slov
cat abc.txt | cat -n | sort -uk 2 | sort -k 1 | cut -f 2smaže duplicity, ale zachová pořadí
cat << xxxpošle příkazu cat řetězec mezi "xxx"
read a b c
1 2 3 4
$a = 1
$b = 2
$c = 3 4
read x < /etc/passwdnačte do $x první řádek z /etc/passwd
read x 2>/dev/null < .forward && echo $x || echo chybavypíše první řádek ze souboru .forward, pokud neexistuje, napíše chybu
sort -gřadí numericky
sort -k2,2řadí podle druhého sloupce
sort -k2,2 -k1,1řadí podle druhého a poté podle prvního sloupce
bbc.txt | tr -cs '[A-Z][a-z]' '[\n*]'jedno slovo na jeden řádek
Zástupné množiny znaků
ahojnormálně zapsané znaky představují sami sebe
.jeden libovolný znak
[abc]množina {a, b, c}
[^abc]doplněk množiny {a, b, c}
*libovolně krát (i nula krát)
\{m,n\}m až n opakování
\{n\}přesně n opakování
\{n,\}alespoň n opakování
^začátek řádku
$konec řádku
\<začátek slova
\>konec slova
[[:alnum:]] nebo [A-Za-z0-9]Alphanumeric characters
[[:alpha:]] nebo [A-Za-z]Alphabetic characters
[[:blank:]] nebo [\x09]Space or tab characters only
[[:cntrl:]] nebo [\x00-\x19\x7F]Control characters
[[:digit:]] nebo [0-9]Numeric characters
[[:graph:]] nebo [!-~]Printable and visible characters
[[:lower:]] nebo [a-z]Lower-case alphabetic chars
[[:print:]] nebo [ -~]rintable(non-Control) chars
[[:punct:]] nebo [!-/:-@[-`{-~]Punctuation characters
[[:space:]] nebo [\t\v\f]All whitespace chars
[[:upper:]] nebo [A-Z]Upper-case alphabetic chars
[[:xdigit:]] nebo [0-9a-fA-F]Hexadecimal digit characters
GREP
grep -vvice versa (naopak) – vypisuje řádky, které neodpovídají výrazu
grep -ckolik řádků odpovídá
grep -icase insensitive
grep -lnázvy souborů, které takový řádek obsahují
grep -nočísluje řádky, které odpovídají
grep -Rrekurzivně v podadresářích
grep root /etc/passwdvypíše řádek z /etc/passwd obsahující řetězec root
grep -v root /etc/passwd-||- neobsahující řetězec root
grep -n root /etc/passwdvypíše řádek z /etc/passwd obsahující řetězec root a na začátek řádku přidá čísla řádků
seq 100 | grep ^[12].$vypíše interval <10, 29>
seq 100 | egrep ^6..*$vypíše všechna čísla začínající na 6 vetší než 10
grep -i href bbc.htmlvšechny řádky, které mají href (nebo HREF, nebo Href)
grep -l root /etc/* 2>/dev/nullvypíše názvy souborů obsahující řetězec root v adresáři /etc (v podadresářích nehledá)
grep -l href `ls *.htm *.html`vypíše názvy souborů, které obsahují řetězec href, v aktuálním adresáři s příponou htm nebo html
grep -c root /etc/* 2>/dev/nullvypíše dva sloupce (oddělené ":") - název souboru v prvním a počet řádků s výskytem root v druhém
ypcat passwd | grep -c '/bash$'počet řádků mající /bash
grep -v ovypíše všechny řádky, které neobsahují o
grep '[^o]'vypíše všechny řádky, až na řádky samých o
(stačí jeden znak aby nebyl óčko a vyhovuje zápisu)
SED
$příkaz začínající na $ se provede na poslední řádek
r fnamepřipojení souboru fname
w fnamezápis do souboru fname
W fnamepřipojení za soubor fname
qukončení práce se SED
pvýpis řádku
lvýpis řádku se speciálními znaky
=výpis čísla řádku
nčtení dalšího řádku
avkládání textu za řádek (<CR>)
ivkládání textu před řádek
jspojení řádků (vynechání <CR>)
dsmazání řádku
cnáhrada úseku
b labelskok na label
pokud je label vynechán, skočí se na konec souboru
grozšíření příkazu na celou zadanou oblast
vnegace g
s/vyraz1/vyraz2náhrada řetězců "vyraz1" za "vyraz2"
\chznak ch (eliminace spec. významu)
cat /etc/passwd | sed -e "s/root/ROOT/g" | sed -neto, co zbyde, nevypíše na vystup
sed -e "root/,/daemon/s/o/X/g"
sed -e "5d"
sed -e "=" /etc/passwd | sed -e "N;s/\n/\t/g"vrátí /etc/passwd pěkně očíslované
sed -ne '/qmail/H;$g;$s/^.//g;$p' /etc/passwdvypíše jen řádky obsahující qmail
sed -e "/qmail/!d"-||-
printf "a\n\nb\n\nc\n" | sed -ne "/./,/^$/p"vymaže duplicitní prázdné řádky
sed '$d' filesmaže poslední řádek souboru
sed '/^Local task/d' file
sed '/\.$/!d' file
sed '5!s/ham/cheese/' filevšude kromě řádku 5 nahradí 'ham' za 'cheese'
sed '3,11 s/ham/cheese/' file
sed '3,11 s/ham/cheese/3' file
sed '3,11 s/ham/cheese/g' file
sed '/awk/!s/aaa/bb/' filev řádkách neobsahující 'awk' se nahradí 'aaa' za 'bb'
sed '17,/foo/d' filesmaže všechny řádky od 17. do řádku obsahujícího 'foo'
sed '/[0-9]\{3\}/p' filevytiskne řádky obsahující 3 číslovky za sebou
sed '/^$/d' filesmazání všech prázdných řádků
sed '/retezec/{G;s/$/Toto je novy text na novem radku/;}' filevložení textu a nového řádku za řádek s daným řetězcem
sed '/Owner:/{s/yours/mine/g;s/your/my/g;s/you/me/g;}' filev řádkách obsahujících 'Owner:' se provedou postupně záměny
AWK
ypcat passwd | awk -F':' '{ printf $5 "\t" $3 "\n" }'výpis pátého a třetího sloupce
ypcat passwd | awk '/\/bash$/ {print $0}'
ypcat passwd | awk ' BEGIN {c=0;} /\/bash$/ {c=c+1;} END {print "pocet radku je "c }'
ps -eo rss | awk 'NR>1 {c=c+$1;} END {print "pocet pameti " c " kB" }'kolik zabírají všechny procesy paměti
ps -eo user,rss,comm | awk '/^ *root / {c=c+$2;} END {print "pocet pameti " c " kB" }'kolik zabírají všechny procesy roota paměti
BC
echo "1+1" | bc
echo "scale=2;5/2" | bc
cut -f2-d: /etc/passwd | tr "\n" "+" | sed -e "s/.$/\n/g" | bc- vrátí součet všech userid z /etc/passwd
- řetězec musí končit novým řádkem, vyjma Solarisu
Archivace, komprese
find ~ -mtime -2nalezení všech souborů v domácím adresáři, které byly změněny za poslední dva dny
find . -name "*.ps" -mtime -7nalezení všech souborů s příponou ps v aktuálním adresáři, které byly změněny za poslední týden
tar cvf ~/archive/curdir.tar *vytvoření archivu aktuálního adresáře do souboru ~/archive/curdir.tar
gzip ~/archive/curdir.tarzkomprimuje archiv, nezachová původní soubor (možno použít také: compress, gzip, bzip2)
gzip -d curdir.tar.gzdekomprimuje soubor curdir.tar.gz
Funkce
návratová hodnotacokoli rozdílné od nuly je špatně
name() {
   return jmeno
}
foo() {
   local prom="Ahoj"
   echo $prom
}
result="$(hello)"
[
rnd=$RANDOM;
[ "`expr $rnd % 2`" = 0 ] && echo $rnd: sude || echo $rnd: liche
rnd=$RANDOM;
if [ "`expr $rnd % 2`" = 0 ];
    else echo $rnd: sude;
    else echo $rnd: liche;
fi
if [ "$USER" == "root" ]; then
    echo "Ahoj admine";
else
    echo "Ahoj uživateli";
fi
if [ $USER == "root" ] && [ $LANG =="cs_CZ" ]; then
    echo "Jsi český admin"
fi
[ výraz ]délka řetězce je nenulová
[ -n výraz ]-||-
[ -z výraz ]délka řetězce je nulová
[ výraz1 == výraz2 ]řetězce jsou shodné
[ výraz1 != výraz2 ]řetězce jsou různé
[ číslo -eq číslo ]čísla jsou shodná
[ číslo1 -le číslo2 ]číslo1 <= číslo2
[ číslo1 -lt číslo2 ]číslo1 < číslo2
[ číslo1 -ge číslo2 ]číslo1 >= číslo2
[ číslo1 -gt číslo2 ]číslo1 > číslo2
[ číslo -ne číslo ]čísla jsou různá
[ soubor -ef soubor ]soubory sdílejí stejný i-uzel
[ soubor -nt soubor ]první soubor je novější
[ soubor -no soubor ]první soubor je starší
[ -e soubor ]soubor existuje
[ -d soubor ]soubor je adresář
[ -f soubor ]soubor je obyčejný soubor
[ -L soubor ]soubor je symbolický odkaz
[ -r soubor ]soubor je zapisovatelný
[ -w soubor ]soubor je zapisovatelný
[ -x soubor ]soubor je spustitelný
CASE
case "$USER" in
  root )
    echo "Ahoj admine"
    ;;
  fuky )
    echo "Ahoj Honzíku"
    ;;
  * )
    echo "Ahoj uživateli"
    ;;
esac
UNTIL
cislo=0
until [ "$cislo" -eq 100 ]; do
  cislo=$((cislo + 10))
  echo $cislo
done
SELECT
select pohlavi in muž žena; do
  …
done
FOR
for i in `seq 10`;do echo $i;done
WHILE
while read line;do
    …
;done < $file
i=1;while [ $i != 11 ];do echo $i;i=`expr $i + 1`;done
while true;do echo .;sleep 1;done
while read x;do echo $x;done < /etc/passwdvypíše /etc/passwd

Creative Commons License