This is an old revision of the document!
Comenzile în shell pot fi înlănțuite pentru a obține noi funcționalități. Anumite comenzi în shell pot primi diverse argumenter pentru a le altera funcționarea, în vreme ce altele primesc informații la standard input. Un one liner poate combina funcționalități precum folosirea operatorului |
(pipe) sau expandarea comenzii ($(...)
) pentru a crea rapid noi funcționalități în linia de comandă.
|
for
for
grep
, tr
, cut
basename
dd
, split
Creați o arhivă .tar.gz
cu toate fișierele din /usr/include
mai mari de 10KB
.
Creați o arhivă .zip
cu toate fișierele din /usr/include
mai mari de 10KB
.
Creați o arhivă .zip
cu toate fișierele din /usr/include
mai mari de 10KB
accesate în ultimele 3 zile.
-atime
a comenzii find
.
Pentru dispozitivele de tip caracter din /dev
afișați numele, majorul și minorul.
find
cu opțiunea -type
și parametrul corespunzător pentru a extrage dispozitivele de tip caracter.
Folosiți stat
cu opțiunile de formatare corespunzătoare și expandarea comenzii ($(...)
) în conjuncție cu comanda find
pentru afișarea numelui, majorului și minorului.
Bonus: Sortați-le în funcție de major.
sort
. Va trebui să specificați separatorul de câmpuri (folosind opțiunea -t
) și cheia de sortare (folosind opțiunea -k
). Pentru că avem cheie de sortare un număr va trebui să faceți sortare numerică.
Câte dispozitive de tip caracter se găsesc în fiecare director din ierarhia /dev
?
find
pentru a extrage dispozitivele de tip caracter.
Folosiți dirname
și expandarea comenzii ($(...)
) în conjuncție cu comanda find
de mai sus pentru a extrage doar numele directoarelor.
Prelucrați output-ul de mai sus prin comanda sort
pentru a-l sorta.
Apoi folosiți output-ul astfel prelucrat prin comanda uniq
cu opțiunea -c
pentru a afișa numărul de apariții al fiecărui director.
Neajunsuri ale expandării comenzii vs find
cu -exec
și vs xargs
(și vs for
)
Folosire head
, tail
, sort
, uniq
, cut
, tr
, wc
Generare parolă random
Prelucrare date datornici
Exemple de expresii regulate
Câte directive #include
conțin fișierele din /usr/include
? Câte directive #include
conțin fișierele de tip header C++ (.hpp
)?
Afișați fișierele din ierarhia /usr/include
în ordinea numărului de apariții ale cuvântului FILE
.
for u in ana bogdan corina dan elena; do echo "user is $u"; done
Pentru început adăugați în sistem utilizatorii ana
, bogdan
, corina
, dan
și elena
folosind utilitarul adduser
:
sudo adduser ana sudo adduser bogdan ...
Ca root, parcurgeți utilizatorii sistemului care au home-ul în /home/
, și creați un director public_html
în home-ul fiecăruia.
/home/
folosim o construcție de forma
grep '/home/' /etc/passwd
Apoi filtrăm output-ul comenzii de mai sus cu ajutorul comenzii cut
pentru a extrage doar prima coloană.
Apoi folosiți for
și expandarea comenzii în forma
for user in $(grep ...); do ...; done
Realizați apoi un one-liner sau un script care să șteargă directorul public_html
.
ls -ld <path/to/folder>
unde <path/to/folder>
este calea către directorul pe care dorim să-l verificăm.
Ca root, parcurgeți utilizatorii sistemului care au home-ul în /home/
, și creați un director public_html
în home-ul fiecăruia. Schimbați ownership-ul acelui director la utilizator folosind chown
.
chown
este rulată doar de root
, adică folosiți sudo
.
O formă de rulare a comenzii chown
este
sudo chown <username> <path/to/file>
unde <username>
este numele utilizatorului către care vrem să schimbăm ownership-ul iar <path/to/file>
este calea către fișierul/directorul pentru care vrem să schimbăm ownership-ul.
ls -ld <path/to/folder>
unde <path/to/folder>
este calea către directorul pentru care dorim să verificăm ownership-ul.
Afișați numele paginilor de manual din secțiunea 5. Numele sunt partea fără extensie din fișierele existente în /usr/share/man/man5/
. De exemplu, pentru fișierul issue.5.gz
, numele este issue
.
Recomandăm pașii de mai jos.
Construiți glob-ul care să afișeze toate fișierele cu extensia .5.gz
din directorul /usr/share/man/man5/
.
Folosiți comanda basename
pentru a extrage doar numele de bază al fișierului. folosiți
basename
ca argumente numele fișierulelor. Pentru a elimina extensia folosiți opțiunea -s
a comenzii basename
.
Trebuie să scoateți extensia 5.gz
.
Din lista de mai sus, extrageți doar comenzile care încep cu o anumită literă. Adică din outputul de mai sus, folosiți o comandă de forma grep '^a
' pentru a extrage liniile care încep cu litera a
folosind grep
.
Dorim să afișăm informații despre fișiere folosind comanda stat
, comandă dedicată exact obținerii de informații despre fișiere.
Afișați pentru fișierul /etc/passwd
doar dimensiunea. Indicație: Folosiți comanda stat
împreună cu opțiunea --format
(sau -c
, forma scurtă a acestei opțiuni).
Afișați pentru fișierul /etc/passwd
inode-ul, dimensiunea și uid-ul, separate prin ,
(virgulă).
Afișați numele, inode-ul, dimensiunea și uid-ul separate prin ,
(virgulă) pentru fișierele din ierarhia /etc/
.
Afișați numele, inode-ul, dimensiunea și uid-ul separate prin ,
(virgulă) pentru fișierele din ierarhia /etc/
care au extensia .conf
.
Calculați totalul de octeți ocupat de fișierele din ierarhia /etc/
care au extensia .conf
. Indicație: Dacă aveți numere (câte unul pe linie) pe care vreți să le adunați, folosiți construcția paste -s -d '+
'. Pentru a efectua calculul, folosiți comanda bc
.
Listați primele 10 fișiere obișnuite (regular files) din ierarhia /etc
(adică din toate directoarele, subdirectoarele și subdirectoarele acestora etc.) sortate în ordinea dimesiunii ocupate de fiecare fișier.
find
cu opțiunea -exec
, stat
(cu opțiunea -c
și formatul necesar pentru afișarea numelui și dimensiuni ca argument către opțiunea -exec
a lui find
), sort
și head
.
Exemplu de rulare pentru find
cu -exec
este
find /etc/ -type f -exec ls -l {} \;
Creați un fișier care să conțină 2048 de octeți de zero (din /dev/zero
) urmați de 2048 de octeți aleatori (din /dev/urandom
) urmați de 2048 de octeți de zero și apoi urmați de 2048 de octeți din fișierul /bin/false
de la offsetul 4096 al fișierului.
skip
și seek
ale comenzii dd
este dat în număr de blocuri, nu în număr de octeți.
Folosiți /dev/urandom
, dd
și split
pentru a genera, într-un one liner, 100 de fișiere a câte 100 de octeți aleatori cu numele partXYZ.dat
unde XYZ
sunt valorile 000, 001, …, 099. Adică part000.dat
, part001.dat
, …, part099.dat
.
dd
poate scrie la standard output în absența opțiunii of
.
split
poate citi de la standard input dacă se folosește construcția -
(semnul minus) pentru numele fișierului.
Folosiți grep
pentru a selecta alias-urile cu destinația de forma nume.prenume@gmail.com
din fișierul liases
din arhiva capitolului. Intrările din fișierul aliases
se consideră de forma alias: destinație
.
Folosiți conținutul fișierului /dev/urandom
pentru a genera o parolă aleatoare de 16 caractere.
tr
cu opțiunile -d
și -c
pentru a extrage doar caractere tipările (litere mici, litere mari, numere).
Folosiți comanda head
cu opțiunea -c
pentru a extrage doar 16
caractere din output-ul anterior.
Actualizați comanda de mai sus pentru a genera 20
de parola a câte 16
caractere.
20*16 = 320
caractere aleatoare și apoi folosiți comanda fmt
cu opțiunea -w
pentru a le grupa în seturi de câte 16
.