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
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.
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.
Pentru afișarea tuturor directoarelor public_html
din home-urile utilizatorilor puteți folosi un glob în forma
ls -ld /home/*/public_html/
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.
Pentru afișarea de informații despre directoarele public_html
din home-urile utilizatorilor puteți folosi un glob în forma
ls -ld /home/*/public_html/
Afișați numele paginilor de manual din secțiunea 5. Numele sunt partea fără extensie din fișierele existente în directorul /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/
.
find
, puteți folosi un glob.
Folosiți comanda basename
pentru a extrage doar numele de bază al fișierului.
basename
ca argumente numele fișierulelor. Pentru a elimina extensia folosiți opțiunea -s
a comenzii basename
.
Opțiunea -s
a comenzii basename
primește ca argument extensia ce trebuie scoasă. 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
.
paste -s -d '+'
. Adică ceva de forma
stat ... | paste -s -d '+'
Output-ul comenzii de mai sus este acum o expresie aritmetică ce poate fi evaluată. Comanda paste -s -d '+'
serializează liniile (opțiunea -s
) punând între ele caracterul +
(pentru adunare).
Pentru a efectua calculul, filtrați expresia aritmetică folosită mai sus prin comanda bc
. Comanda bc
(un calculator în linia de comandă) primește o expresia aritmetică la standard input și o afișează la standard output. Adică o constructție de forma
stat ... | paste -s -d '+' | 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.
stat
pentru a afișa doar numele și dimensiunea fișierului. Adică o construcție de forma
stat -c ... $(find ...)
Apoi filtrați output-ul comenzii de mai sus cu ajutorul comenzii sort
pentru a sorta numeric în funcție de dimensiunea fișierului. Adică o construcție de forma:
stat -c ... $(find ...) | sort ...
Apoi filtrați output-ul prin comanda tail
pentru a extrage doar primele 10
fișiere, în ordinea dimensiunii. Adică o construcție de forma:
stat -c ... $(find ...) | sort ... | tail
Folosiți grep
pentru a selecta alias-urile cu destinația de forma nume.prenume@gmail.com
din fișierul aliases
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.
for
(merge, dar vrem să folosim fold
). Vedeți indicațiile legate de folosirea comenzii fold
de mai jos.
fold
împarte informațiile primite la intrarea standard în linii pe care le afișează la ieșirea standard. Poate să extragă linii de dimensiune dată. Uzual se folosește în forma
<command> | fold
unde <command>
este o comandă care generează informații pe care apoi să le prelucreze comanda fold
.
Extrageți 20*16 = 320
caractere aleatoare și apoi folosiți comanda fold
cu opțiunea -w
pentru a le grupa în seturi de câte 16
. Adică o construcție de forma
cat /dev/urandom | ... | fold -w 16