commit 16cbb42e669a02c33571b67b76a9670a4c1264a9
parent ebb00d7482cf828ed8bd122c2afc07b0fe901831
Author: Christos Margiolis <christos@margiolis.net>
Date: Wed, 2 Dec 2020 21:44:36 +0200
new mips assignments
Diffstat:
15 files changed, 1127 insertions(+), 745 deletions(-)
diff --git a/c-parallel-computing/ex1/doc.pdf b/c-parallel-computing/ex1/doc.pdf
Binary files differ.
diff --git a/c-parallel-computing/ex1/doc.tex b/c-parallel-computing/ex1/doc.tex
@@ -139,11 +139,11 @@ AND είναι γιατί αν έστω και μία από τις \lstinline{s
Τα παρακάτω τρεξίματα έγιναν σε Arch Linux, εξ'ού και τα newlines που ανέφερα
στα προβλήματα και χαλάνε την εμφάνιση του πρόγραμματος.
-\includegraphics[width=\textwidth]{exmpl1.png}
-\includegraphics[width=\textwidth]{exmpl2.png}
-\includegraphics[width=\textwidth]{exmpl3.png}
+\includegraphics[width=\textwidth]{res/exmpl1.png}
+\includegraphics[width=\textwidth]{res/exmpl2.png}
+\includegraphics[width=\textwidth]{res/exmpl3.png}
-\includegraphics[width=\textwidth]{exmpl4.png}
+\includegraphics[width=\textwidth]{res/exmpl4.png}
Σε αυτό το τρέξιμο έδωσα την λίστα που έφερα ως παράδειγμα πιο πάνω
και ανέφερα ότι αν δεν ο κάθε επεξεργαστής δεν ξέρει ποιο είναι το προηγούμενο από
αυτόν στοιχείο, δεν μπορούμε να έχουμε σωστό αποτέλεσμα.
diff --git a/c-parallel-computing/ex1/ex1.c b/c-parallel-computing/ex1/ex1.c
@@ -8,8 +8,7 @@
#define TAG_MENU 4
#define TAG_SORTED 5
#define TAG_VAL 6
-#define TAG_POS 7
-#define TAG_PREV 8
+#define TAG_PREV 7
int
main(int argc, char *argv[])
diff --git a/mips-architecture/lab3_ex1.asm b/mips-architecture/lab3_ex1.asm
@@ -1,25 +1,43 @@
+.eqv SYS_PRINT_WORD 1
+.eqv SYS_PRINT_STRING 4
+.eqv SYS_READ_WORD 5
+.eqv SYS_READ_STRING 8
+.eqv SYS_EXIT 10
+.eqv SYS_PRINT_CHAR 11
+.eqv SYS_READ_CHAR 12
+
+.macro endl()
+ li $v0, SYS_PRINT_CHAR
+ li $a0, 0xa
+ syscall
+.end_macro
+
.data
str1: .asciiz "Hello\n"
str2: .asciiz "TEI\n"
name: .space 64
.text
-.globl main
+.globl _main
-main:
+_main:
# 1. print a character
- li $v0, 11
- la $a0, 'C'
+ li $v0, SYS_PRINT_CHAR
+ li $a0, 'C'
syscall
+ endl()
+
# 2. print characters 'a' and 'd'
li $a0, 'a'
syscall
li $a0, 'd'
syscall
+ endl()
+
# 3. print 'Hello'
- li $v0, 4
+ li $v0, SYS_PRINT_STRING
la $a0, str1
syscall
@@ -30,25 +48,29 @@ main:
syscall
# 5. print 5
- li $v0, 1
+ li $v0, SYS_PRINT_WORD
li $a0, 5
syscall
+ endl()
+
# 6. read a word and print it
- li $v0, 5
+ li $v0, SYS_READ_WORD
syscall
move $t0, $v0
- li $v0, 1
+ li $v0, SYS_PRINT_WORD
la $a0, 0($t0)
syscall
+ endl()
+
# 7. read name, store in mem and print it
- li $v0, 8
+ li $v0, SYS_READ_STRING
la $a0, name
li $a1, 64
syscall
- li $v0, 4
+ li $v0, SYS_PRINT_STRING
syscall
- li $v0, 10
+ li $v0, SYS_EXIT
syscall
diff --git a/mips-architecture/lab3_ex2.asm b/mips-architecture/lab3_ex2.asm
@@ -1,6 +1,20 @@
+.eqv SYS_PRINT_WORD 1
+.eqv SYS_PRINT_STRING 4
+.eqv SYS_READ_WORD 5
+.eqv SYS_READ_STRING 8
+.eqv SYS_EXIT 10
+.eqv SYS_PRINT_CHAR 11
+.eqv SYS_READ_CHAR 12
+
+.macro endl()
+ li $v0, SYS_PRINT_CHAR
+ li $a0, 0xa
+ syscall
+.end_macro
+
.data
- str1: .ascii "hello"
- str2: .space 64
+ str: .asciiz "hello\n"
+ name: .space 64
x: .word 0
a: .word 20
b: .word 30
@@ -9,30 +23,36 @@
.text
.globl main
-main:
+main:
# 1. print 1st and 2nd character in string
- li $v0, 11
- lb $a0, str1
+ li $v0, SYS_PRINT_CHAR
+ lb $a0, str
syscall
- lb $a0, str1 + 1
+ lb $a0, str + 1
syscall
+ endl()
+
# 2. read x and print str[x]
- li $v0, 5
+ li $v0, SYS_READ_WORD
syscall
- lb $a0, str1 + 0($v0)
- li $v0, 11
+ lb $a0, str($v0)
+ li $v0, SYS_PRINT_CHAR
syscall
+ endl()
+
# 3. read a string and print its 2nd char
- li $v0, 8
- la $a0, str2
+ li $v0, SYS_READ_STRING
+ la $a0, name
la $a1, 64
syscall
- lb $a0, str2 + 1
- li $v0, 11
+ lb $a0, name + 1
+ li $v0, SYS_PRINT_CHAR
syscall
+ endl()
+
# 4. int x, a = 20, b = 30, c = 15;
# x = (a + b) - (c + 10);
lw $t0, x
@@ -43,9 +63,11 @@ main:
addi $t5, $t3, 10
sub $t0, $t4, $t5
- li $v0, 1
+ li $v0, SYS_PRINT_WORD
la $a0, 0($t0)
- syscall
+ syscall
+
+ endl()
- li $v0, 10
+ li $v0, SYS_EXIT
syscall
diff --git a/mips-architecture/lab4_ex1.asm b/mips-architecture/lab4_ex1.asm
@@ -0,0 +1,31 @@
+.eqv SYS_PRINT_STRING 4
+.eqv SYS_READ_WORD 5
+.eqv SYS_EXIT 10
+
+.data
+ zstr: .asciiz "Zero\n"
+ nzstr: .asciiz "Non Zero\n"
+
+.text
+.globl main
+
+main:
+ li $v0, SYS_READ_WORD
+ syscall
+
+ bne $v0, $zero, nonzero
+ li $v0, SYS_PRINT_STRING
+ la $a0, zstr
+ syscall
+
+ j exit
+
+nonzero:
+ li $v0, SYS_PRINT_STRING
+ la $a0, nzstr
+ syscall
+ j exit
+
+exit:
+ li $v0, SYS_EXIT
+ syscall
diff --git a/mips-architecture/lab4_ex2.asm b/mips-architecture/lab4_ex2.asm
@@ -0,0 +1,35 @@
+.eqv SYS_PRINT_STRING 4
+.eqv SYS_READ_WORD 5
+.eqv SYS_EXIT 10
+
+.data
+ posstr: .asciiz "Positive\n"
+ nonposstr: .asciiz "Non Positive\n"
+
+.text
+.globl main
+
+main:
+ li $v0, SYS_READ_WORD
+ syscall
+
+ # t0 = 1 if v0 == 0
+ slt $t0, $v0, $zero
+ beq $t0, $zero, pos
+
+ li $v0, SYS_PRINT_STRING
+ la $a0, nonposstr
+ syscall
+
+ j exit
+
+pos:
+ li $v0, SYS_PRINT_STRING
+ la $a0, posstr
+ syscall
+
+ j exit
+
+exit:
+ li $v0, SYS_EXIT
+ syscall
diff --git a/mips-architecture/lab4_ex3.asm b/mips-architecture/lab4_ex3.asm
@@ -0,0 +1,28 @@
+.eqv SYS_EXIT 10
+.eqv SYS_PRINT_CHAR 11
+.eqv LOOP_ITER 5
+
+.text
+.globl main
+
+main:
+ # init loop counter
+ li $t0, 0
+
+loop:
+ # exit if t0 == 5
+ beq $t0, LOOP_ITER, exit
+ addi $t0, $t0, 1
+
+ li $v0, SYS_PRINT_CHAR
+ li $a0, '*'
+ syscall
+
+ j loop
+
+ li $a0, 0xa
+ syscall
+
+exit:
+ li $v0, SYS_EXIT
+ syscall
diff --git a/mips-architecture/lab4_ex4.asm b/mips-architecture/lab4_ex4.asm
@@ -0,0 +1,51 @@
+.eqv SYS_PRINT_STRING 4
+.eqv SYS_READ_WORD 5
+.eqv SYS_EXIT 10
+.eqv SYS_PRINT_CHAR 11
+
+.data
+ msg: .asciiz "Number: "
+ errstr: .asciiz "Give a positive number.\n"
+
+.text
+.globl main
+
+main:
+ li $v0, SYS_PRINT_STRING
+ la $a0, msg
+ syscall
+
+ li $v0, SYS_READ_WORD
+ syscall
+ move $t0, $v0
+
+ # exit if t0 <= 0
+ beq $t0, $zero, err
+ slt $t1, $t0, $zero
+ bne $t1, $zero, err
+
+ # init loop counter
+ li $t2, 0
+
+loop:
+ beq $t2, $t0, exit
+ addi $t2, $t2, 1
+
+ li $v0, SYS_PRINT_CHAR
+ li $a0, '*'
+ syscall
+
+ j loop
+
+ li $v0, SYS_PRINT_CHAR
+ li $a0, 0xa
+ syscall
+
+err:
+ li $v0, SYS_PRINT_STRING
+ la $a0, errstr
+ syscall
+
+exit:
+ li $v0, SYS_EXIT
+ syscall
diff --git a/mips-architecture/lab4_ex5.asm b/mips-architecture/lab4_ex5.asm
@@ -0,0 +1,42 @@
+.eqv SYS_EXIT 10
+.eqv SYS_PRINT_CHAR 11
+.eqv OUTLOOP_ITER 5
+.eqv INLOOP_ITER 4
+
+.text
+.globl main
+
+main:
+ # init outer loop counter
+ li $t0, 0
+
+outloop:
+ # exit if t0 == 5
+ beq $t0, OUTLOOP_ITER, exit
+ addi $t0, $t0, 1
+
+ # init inner loop counter
+ li $t1, 0
+
+ # print newline
+ li $v0, SYS_PRINT_CHAR
+ li $a0, 0xa
+ syscall
+ j inloop
+
+ j outloop
+
+inloop:
+ # break inner loop if t1 == 4
+ beq $t1, INLOOP_ITER, outloop
+ addi $t1, $t1, 1
+
+ li $v0, SYS_PRINT_CHAR
+ li $a0, '*'
+ syscall
+
+ j inloop
+
+exit:
+ li $v0, SYS_EXIT
+ syscall
diff --git a/mips-architecture/lab4_ex6.asm b/mips-architecture/lab4_ex6.asm
@@ -0,0 +1,77 @@
+.eqv SYS_PRINT_STRING 4
+.eqv SYS_READ_WORD 5
+.eqv SYS_EXIT 10
+.eqv SYS_PRINT_CHAR 11
+
+.macro input(%msg)
+ li $v0, SYS_PRINT_STRING
+ la $a0, %msg
+ syscall
+
+ li $v0, SYS_READ_WORD
+ syscall
+.end_macro
+
+.macro ispositive(%val)
+ # exit if t0 or $t1 <= 0
+ beq %val, $zero, err
+ slt $t2, %val, $zero
+ bne $t2, $zero, err
+.end_macro
+
+.data
+ msg1: .asciiz "Lines: "
+ msg2: .asciiz "Chars: "
+ errstr: .asciiz "Give positive numbers only.\n"
+
+.text
+.globl main
+
+main:
+ input(msg1)
+ move $t0, $v0
+
+ input(msg2)
+ move $t1, $v0
+
+ ispositive($t0)
+ ispositive($t1)
+
+ # init outer loop counter
+ li $t3, 0
+
+outloop:
+ # exit if t3 == x
+ beq $t3, $t0, exit
+ addi $t3, $t3, 1
+
+ # init inner loop counter
+ li $t4, 0
+
+ # print newline
+ li $v0, SYS_PRINT_CHAR
+ li $a0, 0xa
+ syscall
+ j inloop
+
+ j outloop
+
+inloop:
+ # break inner loop if t4 == y
+ beq $t4, $t1, outloop
+ addi $t4, $t4, 1
+
+ li $v0, SYS_PRINT_CHAR
+ li $a0, '*'
+ syscall
+
+ j inloop
+
+err:
+ li $v0, SYS_PRINT_STRING
+ la $a0, errstr
+ syscall
+
+exit:
+ li $v0, SYS_EXIT
+ syscall
diff --git a/sh-os1/ex1/ex1.txt b/sh-os1/ex1/ex1.txt
@@ -1,709 +1,750 @@
-Eργαστήριο ΛΣ 1 / Άσκηση 1 / 2020-21
-Ονοματεπώνυμο: Χρήστος Μαργιώλης
-ΑΜ: [REDACTED]
-====================================
-
-Ερώτηση 1:
-----------
-Δημιουργήστε στον τρέχοντα κατάλογο το αρχείο 'ask1.txt' με τα ακόλουθα
-περιεχόμενα(όνομα, επώνυμο, username, ΤΚ, περιοχή, τηλ.), και εμφανίστε
-το στησυνέχεια στην οθόνη, με αριθμημένες τις γραμμές του.
-
-Απάντηση:
-Προκειμένου να δημιουργήσουμε ένα αρχείο χρησιμοποιούμε την εντολή 'touch [FILE...]',
-όπου FILE είναι το όνομα του αρχείου και ... ότι μπορούμε να δώσουμε όσα ορίσματα
-θελουμε. Στην προκειμένη περίπτωση
-
- touch ask1.txt
-
-Αν και θα μπορούσαμε να γράψουμε τα δεδομένα του αρχείο σε έναν
-κειμενογράφο, χρησιμοποιώντας την 'echo' (και οποιαδηποτε παρόμοια εντολή,
-όπως την 'printf'), μπορούμε να ανακατευθύνουμε την έξοδο της στο αρχείο που θέλουμε,
-οπότε μπορούμε με τις παρακάτω εντολές να έχουμε το ίδιο αποτέλεσμα.
-Για χάρην απλότητας στο διάβασμα επέλεξα να καλέσω αρκετές φορές την 'echo' αντί να
-ενώσω τα πάντα με newlines. Από την δεύτερη κλήση της και μετά το >> σημαίνει
-ότι θέλουμε να γράψουμε στο τέλος του αρχείο, όχι να γράψουμε το αρχείο από την αρχή.
-
- echo "George Pappas george2 12136 Peristeri-------" > ask1.txt
- echo "Nick Nikolaoy nick23 12232 Aigaleo 5314555" >> ask1.txt
- echo "George Georgioy george583 11132 Athens-------" >> ask1.txt
- echo "Helen Georgioy helen3 12136 Peristeri 5748456" >> ask1.txt
- echo "Nick Pappas nick4 11223 Aigaleo 5324123" >> ask1.txt
- echo "Helen Ioannoy helen367 13222 Athens ------- >> ask1.txt
- echo "Helen Thanoy helen36 11132 Peristeri9718345 >> ask1.txt
- echo "Vasilis Mamalis vas32 12345 Dafni 9738383 >> ask1.txt
-
-Για να εμφανίσουμε τα περιεχόμενα του αρχείου με αριθμημένες σειρές,
-θα χρησιμοποιηθεί η εντολή 'nl', η οποία αριθμεί σειρές, δέχοντας ως
-input το αρχείο με τα περιεχόμενα.
-
- nl ask1.txt
-
-Αποτέλεσμα εκτέλεσης εντολής:
-
- 1 George Pappas george2 12136 Peristeri-------
- 2 Nick Nikolaoy nick23 12232 Aigaleo 5314555
- 3 George Georgioy george583 11132 Athens-------
- 4 Helen Georgioy helen3 12136 Peristeri 5748456
- 5 Nick Pappas nick4 11223 Aigaleo 5324123
- 6 Helen Ioannoy helen367 13222 Athens -------
- 7 Helen Thanoy helen36 11132 Peristeri9718345
- 8 Vasilis Mamalis vas32 12345 Dafni 9738383
-
-Ερώτηση 2:
-----------
-Τρέξτε την εντολή cal -3 > calfile.txt και εξηγείστε τι ακριβώς κάνει.
-
-Απάντηση:
-Η εντολή 'cal' αρχικά εμφανίζει ημερολόγιο του τρέχοντος μήνα. Με την
-εντολή
-
- cal -3 > calfile.txt
-
-Θα εμφανιστεί ο προηγούμενος, τρέχων και επόμενος μήνας, και στην συνέχεια
-το output της εντολής θα γραφτεί στο αρχείο calfile.txt
-
-Ερώτηση 3:
-----------
-Συνενώστε τα αρχεία calfile.txt και ask1.txt σε ένα αρχείο με όνομα full.txt
-
-Απάντηση:
-Για την συνένωση των δύο παραπάνω αρχείων - και γενικότερα δύο ή παραπάνω
-αρχειών - χρησιμοποιούμε την εντολή 'cat', οπότε
-
- cat calfile.txt ask1.txt > full.txt
-
-Ερώτηση 4:
-----------
-Εμφανίστε στην οθόνη τα πέντε πιο πρόσφατα τροποποιημένα αρχεία του καταλόγου σας.
-
-Απάντηση:
-Για να εμφανίσουμε τα αρχεία του καταλόγου χρησιμοποιούμε την εντολή 'ls'.
-Προκειμένου να εμφανιστούν κατά ημερομηνία τροποποίησης ενεργοποιούμε την
-επιλογή -t. Έπειτα θα κάνουμε pipe το output του 'ls' στην εντολή 'head' για να
-εμφανίσουμε μόνο τα 5 πρώτα αρχεία.
-
- ls -t | head -6
-
-Ερώτηση 5:
-----------
-Δημιουργήστε έναν κατάλογο με όνομα 'mydir1'. Μεταβείτε σε αυτόν και στη
-συνέχεια αντιγράψτε εκεί (χωρίς να αλλάξετε κατάλογο) το αρχείο 'full.txt'
-(από το γονικό κατάλογο). Μετονομάστε το εν συνεχεία σε 'new.txt'.
-Επιστρέψτε στο γονικό κατάλογο. Διαγράψτε τον κατάλογο 'mydir1' και τα
-περιεχόμενά του.
-
-Απάντηση:
-Οι εντολές που θα χρειαστούμε είναι οι εξής:
-mkdir: Δημιουργεί κατάλογο
-cd: Αλλάζει κατάλογο
-cp: Αντιγράφει αρχεία και καταλόγους
-rm -rf: Διαγράφει αναδρομικά έναν κατάλογο (εφόσον υπάρχει το -rf)
-
-Στην πρώτη σειρά, το && σημαίνει ότι η επόμενη εντολή θα εκτελεστεί
-μόνο αν η προηγούμενη εντολή εκτελεστεί επιτυχώς. Στην δεύτερη σειρά
-το '.' δηλώνει τον κατάλογο που βρισκόμαστε - το '..' δηλώνει
-τον γονικό κατάλογο.
-
- mkdir mydir1 && cd mydir1
- cp ../full.txt .
- cd ..
- rm -rf mydir1
-
-Ερώτηση 6:
-----------
-Δώστε τις εντολές που θα εμφανίσουν:
-(α) όλα τα αρχεία του καταλόγου /usr με πληροφορίες για το inode τους και
-το μέγεθος τους σε blocks.
-(β) όλα τα περιεχόμενα του δέντρου καταλόγων και υποκαταλόγων (αναδρομικά)
-που βρίσκονται κάτω από τον κατάλογο /usr, με πλήρεις πληροφορίες για
-κάθε ένα από αυτά και εμφανιζόμενα σταδιακά, σελίδα προς σελίδα.
-
-Απάντηση:
-Και στα δύο υποερωτήματα θα χρησιμοποιηθεί η εντολή 'ls'
-(α) Η επιλογή -i εμφανίζει το inode και η επιλογή
--s το μέγεθος σε blocks, οπότε
-
- ls -lsi /usr
-
-(β) Η επιλογή -R εμφανίζει αναδρομικά όλα τα περιεχόμενα ενός
-καταλόγου, οπότε
-
- ls -lR /usr
-
-Ερώτηση 7:
-----------
-Δημιουργήστε έναν κατάλογο με όνομα 'testdir1'. Μεταβείτε σε αυτόν
-και φτιάξτε εκεί ένα hard link (με το όνομα 'ask1link') προς το αρχείο
-'ask1.txt' του γονικού καταλόγου. Βεβαιωθείτε (δίνοντας την κατάλληλη
-εντολή και εξηγώντας τι βλέπετε) ότι έχει δημιουργηθεί και ότι δεν είναι
-symbolic (soft) link.
-
-Απάντηση:
-Για να φτιάξουμε hard link θα χρησιμοποιήσουμε την εντολή 'ln'.
-
- mkdir testdir1 && cd testdir1
- ln ../ask1.txt ask1link
-
-Αν εκτελέσουμε την εντολή 'ls -li' στον κατάλογο testdir1 θα δούμε
-ότι σε αντίθεση με το soft link, στο hard link δεν εμφανίζεται
-το -> το οποίο δηλώνει ότι είναι symbolic link. Επίσης
-παρατηρούμε ότι και το ask1link αλλά και το ask1.txt έχουν το ίδιο
-inode.
-
-Ερώτηση 8:
-----------
-Μπείτε στο αρχείο 'ask1link' και διαγράψτε την τελευταία του γραμμή.
-Βεβαιωθείτε στη συνέχεια ότι η αλλαγή αυτή έχει γίνει και στο αρχείο 'ask1.txt'.
-
-Απάντηση:
-Εφόσον το ask1link ειναι hardlink στο ask1.txt, δηλαδή είναι reference
-στο ask1.txt, ό,τι αλλαγή γίνει στο ένα αρχείο, θα γίνει και στο άλλο,
-οπότε αν διαγράψουμε την τελευταία γραμμή από το ask1link, η αλλαγή
-πράγματι θα έχει γίνει και στο ask1.txt.
-
-Ερώτηση 9:
-----------
-Δημιουργήστε ένα κατάλογο kat1 και μέσα σε αυτόν δύο αρχεία, file1 και file2,
-με περιεχόμενο τη λέξη 'one' το ένα και τη λέξη 'two' το άλλο.
-Τρέξτε (μέσα στον κατάλογο kat1) την εντολή 'cp *' και εξηγήστε το αποτέλεσμα.
-Στη συνέχεια τρέξτε την εντολή 'mv *' και εξηγήστε το αποτέλεσμα.
-
-Απάντηση:
-Αρχικά πρέπει να γράψουμε τα περιέχομενα στα κατάλληλα αρχεία.
-
- echo "one" > file1
- echo "two" > file2
-
-Αφού τρέξουμε την εντολή 'cp *' στον kat1 θα παρατηρήσουμε ότι και τα
-δύο αρχεία τώρα έχουν την λέξη "one".
-
- $ cat file1 file2
-
- one
- one
-
-Αυτό γίνεται επειδή γράφοντας 'cp *', επιλέγουμε όλα τα αρχεία του
-καταλόγου. Επειδή όμως έχουμε δύο αρχεία η εντολή θα αναπτυχθεί σε
-
- cp file1 file2
-
-και αυτό που θα γίνει τελικά είναι να αντιγραφεί το file1 στο file2.
-Όταν τρέξουμε την εντολή 'mv *' θα δούμε ότι διαγράφεται το file1,
-επειδή, όπως και με την 'cp *', η εντολή θα αναπτυχθεί σε
-
- mv file1 file2
-
-οπότε το file1 θα μετονομαστεί σε file2, και έτσι θα χαθεί.
-
-Ερώτηση 10:
------------
-Εμφανίστε τις γραμμές του αρχείου 'ask1.txt' οι οποίες τελειώνουν
-με ένα ή περισσότερα συνεχόμενα ψηφία.
-
-Απάντηση:
-Η εντολή 'grep' δέχεται ένα regular expression (regex) και επιστρέφει
-τις γραμμές στο αρχείο στις οποίες βρίσκεται το regex.
-Το regex που θα ψάξουμε θα αποτελείται από τα εξής μέρη:
-
-1. [0-9] - οποιδήποτε ψηφίο από το 0 εώς το 9
-2. \+ - μία ή παραπάνω επαναλήψεις του προηγούμενου
-3. $ - τέλος γραμμής
-
-Οπότε η τελική εντολή θα είναι
-
- grep "[0-9]\+$" ask1.txt
-
-Ερώτηση 11:
------------
-Εμφανίστε τις γραμμές του αρχείου 'ask1.txt' οι οποίες περιέχουν μεν
-το πρότυπο 'Pap' αλλά δεν περιέχουν το πρότυπο 'Aig'.
-
-Απάντηση:
-Στην εντολή 'grep' η επιλογή -v αποκλείει το δοθέν regex. Προκειμένου
-πρώτα να πάρουμε τις γραμμές που περιέχουν το πρότυπο 'Pap' αλλα όχι
-το πρότυπο 'Aig', θα εκτελέσουμε το 'grep' 2 φορές, ώστε πρώτα να πάρουμε
-όλες τις γραμμές που περιέχουν το 'Pap' και μετά να αποκλείσουμε το 'Aig'.
-
- grep 'Pap' ask1.txt | grep -v 'Aig'
-
-Ερώτηση 12:
------------
-Εμφανίστε τις γραμμές του αρχείου 'ask1.txt' οι οποίες δεν αρχίζουν
-με 'G' ή 'N' και περιέχουν εν συνεχεία (κάπου στα περιεχόμενά τους)
-τα πρότυπα 'Geo' και 'Per' με αυτή τη σειρά.'
-
-Aπάντηση:
-Όπως και στην ερώτηση 11, θα μπορούσαμε να χρησιμοποιήσουμε την επιλογή
--v για την εντολή 'grep', αλλα θα χρησιμοποιήσουμε μία διαφορετική σύνταξη.
-Αυτή τη φορά τα regex που θα ψάξουμε είναι τα εξής
-
-Για την πρώτη κλήση:
-1. ^ - ξεκινάει με
-2. ^[GN] - πρεπει να ξεκινάει με G ή N
-3. ^[^GN] - ΔΕΝ πρέπει να ξεκινάει με G ή N
-
-Για την δεύτερη κλήση:
-1. Geo - περιέχει την λέξη 'Geo'
-2. .* - οποιοσδήποτε αριθμός οποιουδήποτε χαρακτήρα
-3. Per - περιέχει την λέξη 'Per'
-
-Οπότε η τελική εντολή είναι (το | ειναι separator)
-
- grep "^[^GN]" ask1.txt | grep "Geo.*Per"
-
-Αποτέλεσμα εκτέλεσης εντολής:
-
- Helen Georgioy helen3 12136 Peristeri 5748456
-
-Ερώτηση 13:
------------
-Πόσοι χρήστες που το username τους δεν αρχίζει από 'ls1' είναι
-συνδεδεμένοι στο σύστημα;
-
-Απάντηση:
-Η εντολή 'who' μπορεί να μας επιστρέψει μια λίστα με τους χρήστες
-που είναι συνδεδεμένοι. Ο λόγος που χρησιμοποίησα την 'who' αντί
-για την 'w' που κάνει περίπου το ίδιο πράγμα είναι επειδή η 'w'
-έχει και μια γραμμή header στην αρχή, οπότε 'wc -l' θα την μέτραγε.
-Με την χρήση της εντολής 'wc' μπορούμε να μετρήσουμε λέξεις, γραμμές
-και χαρακτήρες. Αν στην εντολή 'wc' δώσουμε την επιλογή -l τότε θα
-μετρήσει μόνο πόσες γραμμές έχει το input που της δώθηκε.
-
- who | grep -v "^ls1" | wc -l
-
-Ερώτηση 14:
------------
-Εμφανίστε όλες τις διεργασίες χρηστών (αλλ/σης) που τρέχουν αυτή
-τη στιγμή στο σύστημα.
-
-Απάντηση:
-Η εντολή 'ps' (process status) εμφανίζει τις τρέχουσες διεργασίες που
-εκτελεί το σύστημα. Επιπλέον θα χρειαστούμε τις επιλογές a και u, οι οποίες
-εμφανίζουν τις διεργασίες που εκτελούνται από όλους τους συνδεδεμένους χρήστες
-αυτή τη στιγμη. Στην εντολή 'ps' χρησιμοποιήσα την BSD σύνταξη.
-
- ps -au
-
-Αποτέλεσμα εκτέλεσης της εντολής:
-
- USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
- christos 5200 0.1 0.1 18048 7084 2 Ss 21:44 0:09.04 /usr/local/bin/zsh
- christos 1160 0.0 0.1 15072 6016 v0 I 12:19 0:00.07 -zsh (zsh)
- christos 1175 0.0 0.0 11828 3044 v0 I+ 12:19 0:00.00 /bin/sh /usr/local/bin/startx
- christos 1188 0.0 0.0 13164 3240 v0 I+ 12:19 0:00.00 xinit /home/christos/.xinitrc
- christos 1192 0.0 0.1 22152 11360 v0 S 12:19 0:19.69 dwm
- christos 1218 0.0 0.1 17136 8000 0- S 12:20 0:16.20 slstatus
- christos 5005 0.0 0.1 18004 7000 1 Is 21:15 0:00.31 /usr/local/bin/zsh
- christos 5193 0.0 0.2 28028 16288 1 S+ 21:44 0:07.88 nvim ex1.txt
- christos 6849 0.0 0.0 11860 3080 2 R+ 00:22 0:00.00 ps -u
- root 1158 0.0 0.0 10880 2304 v1 Is+ 13:14 0:00.00 /usr/libexec/getty Pc ttyv1
- root 1159 0.0 0.0 10880 2304 v2 Is+ 13:14 0:00.00 /usr/libexec/getty Pc ttyv2
- root 1160 0.0 0.0 10880 2304 v3 Is+ 13:14 0:00.00 /usr/libexec/getty Pc ttyv3
-
-Ερώτηση 15:
------------
-Πόσες διεργασίες χρηστών (αλλ/σης) τρέχουν στο σύστημα και τελειώνει
-το όνομά τους με 'sh' ?
-
-Απάντηση:
-Τρέχοντας την εντολή της ερώτησης 14 (ps -ux) και φιλτράροντας
-το ouput ώστε να πάρουμε μόνο τις γραμμές που τελειώνουν σε
-'sh', έχω 3 διεργασίες που το όνομα τους τελειώνει σε 'sh'
-
- ps -au | grep "sh$" | wc -l
-
-Συνολικά έχουμε 3 διεργασίες που τελειώνουν σε sh.
-
-Ερώτηση 16:
------------
-Εμφανίστε όλες τις διεργασίες χρηστών (αλλ/σης) που τρέχουν αυτή τη στιγμή στο σύστημα.
-
-Απάντηση:
-Αυτή τη φορά στην εντολή 'ps', πέρα από την επιλογή u, θα δώσουμε και την επιλογή
-x, η οποία εμφναίζει πληροφορίες ακόμα και για διεργασίες που δεν ελέγχουν κάποιο terminal
-
- ps -aux
-
-Το output της εντολής είναι πολύ μεγάλο για να το συμπεριλάβω εδώ.
-
-Ερώτηση 17:
------------
-Πόσα αρχεία του τρέχοντος καταλόγου σας (μόνο του τρέχοντος -όχι και
-των υποκαταλόγων του) έχουν permissions 'rw' από τους πάντες και 'x'
-από κανέναν;
-
-Απάντηση:
-Η 'ls -l' στην αρχή κάθε σειράς εμφανίζει το permission string και με την
-'grep' μπορούμε να εμφανίσουμε μόνο τις γραμμές που περιέχουν το permission
-που ζητάει η εκφώνηση. Τέλος διοχετεύουμε την έξοδο στην 'wc -l'.
-
- ls -l | grep "^-rw-rw-rw-" | wc -l
-
-Ερώτηση 18:
------------
-Βρείτε τους καταλόγους του συστήματος που το όνομά τους αρχίζει από 'b'.
-
-Απάντηση:
-Η εντολή 'find' είναι μια πιο ανεπτυγμένη μορφή της 'ls' στην οποία μπορούμε
-να δώσουμε πολλές παραπάνω επιλογές. Οι επιλογές που έχουν δωθεί στην παρακάτω εντολή
-σημαίνουν τα εξής:
-/* - η αναζήτηση ξεκινάει από την ρίζα του συστήματος (root directory)
--type d - αναζήτηση μόνο για directories
--name "b*" - το όνομα τους πρέπει να ξεκινάει από 'b'
-
- find /* -type d -name "b*"
-
-Ερώτηση 19:
------------
-Να βρείτε και να παρουσιάσετε στην οθόνη με πλήρεις πληροφορίες
-όλα τα αρχεία με όνομα που αρχίζει από tty και βρίσκονται στον κατάλογο /dev.
-
-Απάντηση:
-Η εντολή stat επιστρέφει πλήρεις πληροφορίες για ένα αρχείο.
-Με την εντολή 'grep', όπως έχει ειπωθεί και σε παραπάνω ερωτήσεις, μπορούμε
-να πάρουμε τις γραμμές στις οποίες γίνεται match ένα regular
-expression - έτσι κατά την εμφάνιση των αρχείων του /dev μπορούμε
-να εξάγουμε μόνο όσες γραμμές περιέχουν την λέξη 'tty'.
-
- stat /dev/* | grep "tty"
-
-Ερώτηση 20:
------------
-Ταξινομήστε τα περιεχόμενα του αρχείου 'ask1.txt' ως προς το
-username σε φθίνουσα σειρά.
-
-Απάντηση:
-Θα ταξινομίσουμε το αρχείο με την χρήση της εντολής 'sort'.
-Στην εντολή αυτή μπορούμε να της δώσουμε κατα ποιά στήλη θέλουμε
-να ταξινομηθεί το αρχείο με την επιλογή -k. Εφόσον username
-βρίσκεται στην 3η στήλη, θα δώσουμε την 3η στήλη ως μέσο
-σύγκρισης για ταξινόμηση. Επίσης, προκειμένου να είναι κατα
-φθήνουσα σειρά η ταξινόμηση, θα χρησιμοποιήσουμε την επιλογή -r
-
- sort -rk 3 ask1.txt
-
-Σε περίπτωση που θέλουμε οι αλλαγές να γραφτούν στο αρχείο, μπορούμε
-να γράψουμε την εντολή ως
-
- sort -rk 3 ask1.txt -o ask1.txt
-
-Ερώτηση 21:
------------
-Ταξινομήστε τα '.c' αρχεία του καταλόγου στον οποίον δουλεύετε ως
-προς το μέγεθός τους.
-
-Απάντηση:
-Στην εντολή 'ls' η επιλογή -S ταξινομεί τα αρχεία ανάλογα με το
-μέγεθός του κατα φθήνουσα σειρά (μεγαλύτερο πρώτα), οπότε
-
- ls -S *.c
-
-Ερώτηση 22:
------------
-Ταξινομήστε τα αρχεία του λογαριασμού σας με permissions 644
-ως προς το μέγεθός τους.
-
-Απάντηση:
-Μπορούμε να εμφανίσουμε αρχεία που έχουν συγκεκριμένα permissions
-με την εντολή 'find' και την επιλογή -perm [PERMISSION] όπου
-το PERMISSION πρέπει να δωθεί σε οκταδικό. Επίσης μέσα στην 'find'
-μπορούμε να εκτελέσουμε και επιπλέον shell commands στο output της με
-την επιλογή -exec [COMMAND] - θα χρησιμοποιήσουμε την 'ls -lS' ώστε
-να ταξινομήσει το output κατα μέγεθος. Η τελική εντολή θα εκτελεστεί
-στον κατάλογο '/usr/home/christos', ο οποίος είναι ο κατάλογος του λογαριασμού
-μου. Το {} \; στο τέλος της εντολής δηλώνει ότι η 'ls -lS' θα εκτελεστεί
-σε κάθε αρχείο που βρίσκεται από την 'find'.
-
- find /usr/home/christos -perm 644 -exec ls -lS {} \;
-
-
-Ερώτηση 23:
------------
-Ταξινομήστε όλα τα περιεχόμενα του καταλόγου /dev κατά πρώτον ως προς
-τον owner και κατά δεύτερον ως προς το group και αποθηκεύστε το
-output στο αρχείο 'binfiles.txt'.
-
-Аπάντηση:
-Παίρνοντας πληροφορίες για τον owner και το group των αρχείων με την
-'ls -l' μπορούμε να ταξινομήσουμε τις κατάλληλες στήλες (3 για owner
-και 4 για group).
-
- ls -l | sort -k 3,4 > binfiles.txt
-
-Ερώτηση 24:
------------
-Φτιάξτε ένα αρχείο που θα περιέχει πληροφορίες μόνο για τους συνδεδεμένους
-χρήστες που το username τους αρχίζει από 'ls1', ταξινομημένο ως προς
-την ημερομηνία και ώρα σύνδεσή τους.
-
-Απάντηση:
-ΑΦού φιλτραριστεί το ouput της 'w' ώστε να πάρουμε μόνο τους
-χρήστες που το όνομά τους ξεκινάει από ls1, θα ταξινομήσουμε
-κατά 2η και 3η στείλει επειδή αυτές δείχνουν την ημερομηνία
-και ώρα σύνδεσης.
-
- w | grep "^ls1" | sort -k 2,3 > userinfo.txt
-
-Ερώτηση 25:
------------
-Αλλάξτεστο αρχείο 'ask1.txt' το όνομα 'Nick' (όπου συναντάται) σε 'Nickolaos'.
-
-Απάντηση:
-Με την χρήση της εντολής 'sed' (stream editor) μπορούμε να αλλάξουμε ένα
-pattern κάθε φορά που συναντάται με την παρακάτω σύνταξη
-
- sed "s/PATTERN/NEWPATTERN/g" file
-
-Τo g στο τέλος σημαίνει ότι αυτή η αλλαγή πρέπει να γίνει σε όλο το αρχείο,
-και όχι μόνο την πρώτη φορά που θα συναντήσει το PATTERN.
-Οπότε, στην προκειμένη περίπτωση η εντολή που θα εκτελεστεί είναι
-
- sed "s/Nick/Nickolaos/g" ask1.txt
-
-Εάν θέλουμε οι αλλαγές να αποθηκευτούν στο αρχείο κατευθείαν, μπορούμε
-να εκτελέσουμε την εντολή με την επιλογή -i.
-
- sed -i "s/Nick/Nickolaos/g" ask1.txt
-
-Ερώτηση 26:
------------
-Έστω τα ακόλουθα items του filesystem με protection strings:
-(α) '-rwxr-x--x',
-(β) 'drwxr-x---' και
-(γ) 'drwx--x--x.
-Εξηγείστε τι είδους items είναι και ποια τα δικαιώματα πρόσβασης user,
-group και others σε αυτά.
-
-Απάντηση:
-(α) Το είδος item είναι απλό αρχείο εφόσον το πρώτο πεδίο του protection string
-είναι κενό. Όσο αφορά τα δικαίωματα του, δικαίωμα εγγραφής έχει μόνο ο ιδιοκτήτης
-του αρχείο, διαβάσματος ο ιδιοκτήτης του αρχείου, και όσοι είναι στο ίδιο group με αυτόν.
-Επίσης όλοι οι χρήστες μπορούνε να το εκτελέσουν.
-
-(β) Το είδος είναι directory λόγω του 'd' στο πρώτο πεδίο του string. Δικαίωμα εγγραφής
-έχει μόνο ο ιδιοκτήτης, διαβάσματος και εκτέλεσης ο ιδιοκτήτης και τα μέλη του group -
-οι υπόλοιποι χρήστες δεν έχουν δικαιώματα για το συγκεκριμένο directory.
-
-(γ) Το είδος είναι επίσης directory λόγω του 'd' στο πρώτο πεδίο του string. Δικαίωμα
-εγγραφής και διαβάσματος έχει μόνο ο ιδιοκτήτης και εκτέλεσης όλοι οι χρήστες.
-
-Ερώτηση 27:
------------
-Αλλάξτε τα permissions όλων των αρχείων του καταλόγου 'testdir1'
-έτσι ώστε να έχουν δικαίωμα εκτέλεσης και εγγραφής μόνο ο ιδιοκτήτης,
-ενώ δικαίωμα ανάγνωσης να έχουν όλοι.
-
-Απάντηση:
-Η εντολή 'chmod' μπορεί να αλλάξει permissions. Με την επιλογή 'R' δηλώνουμε
-ότι αυτό θέλουμε να γίνει αναδρομικά εφόσον θέλουμε να αλλάξουμε τα permissions
-όλων των αρχείων του καταλόγου 'testdir1'. Τα υπόλοιπα πεδία σημαίνουν τα εξής:
-u=wx - μόνο ο ιδιοκτήτης του αρχείου έχει δικαίωμα εγγραφής και εκτέλεσης
-o=r - οι υπόλοιποι χρήστες έχουν δικαίωμα ανάγνωσης
-
- chmod -R u=wx,o=r testdir
-
-Ερώτηση 28:
------------
-Αλλάξτε τα permissions του καταλόγου 'testdir1' έτσι ώστε να έχουν δικαίωμα
-πρόσβασης μόνοο ιδιοκτήτης και οι χρήστες του ιδίου με αυτόν group,
-ενώ οι υπόλοιποι χρήστες να μην έχουν (θεωρείστε ότι τα τρέχοντα
-permissions του καταλόγου είναι 755).
-
-Απάντηση:
-Χρησιμοποιώντας πάλι την εντολή 'chmod' μπορούμε να αλλάξουμε και τα permissions
-ενός καταλόγου. Τα πεδία τώρα σημαίνουν τα εξής:
-ug=r - ο ιδιοκτήτης και τα μέλη του group έχουν δικαίωμα διαβάσματος
-o-r - οι υπόλοιποι χρήστες δεν έχουν δικαίωμα διαβάσματος
-
- chmod ug=r,o-r testdir
-
-Ερώτηση 29:
------------
-Δημιουργήστε έναν νέο χρήστη στο σύστημά σας με username 'myfriend'.
-Αλλάξτε στη συνέχεια τον ιδιοκτήτη του αρχείου 'ask1.txt' σε 'myfriend' και
-μετακινήστε το στο working directory του. Περιορίστε τέλος το διαθέσιμο
-χώρο αποθήκευσης στο δίσκο για το συγκεκριμένο χρήστη στα 10MB.
-
-Απάντηση:
-Για να φτιάξουμε έναν user χρησιμοποιούμε την εντολή 'useradd'. Σε BSD
-συστήματα η εντολή είναι η 'adduser'. Για να αλλάξουμε ιδιοκτήτη αρχείου
-χρησιμοποιούμε την εντολή 'chown'. Τέλος, για να περιορίσουμε τον χώρο
-αποθηκεύσης στον δίσκο για έναν χρήστη χρησιμοποιούμε την εντολή 'edquota'.
-
- useradd -m -d /home/myfriend myfriend
- chown myfriend ask1.txt
- mv ask1.txt /home/myfriend
- edquota myfriend
-
-Η εντολή 'edquota' θα μάς ανοίξει στον default editor μας ένα αρχείο
-στο οποίο μπορούμε να τροποποιήσουμε τον αποθηκευτικό χώρο για τον χρήστη
-myfriend. Θα πρέπει να δούμε κάτι σαν
-
- Disk quotas for user ice19390133 (uid 1022):
- Filesystem blocks soft hard inodes soft hard
- /dev/vda1 36 10240 13312 11 0 0
-
-Το 'soft' το θέτουμε σε 10240 (kilobyte), δηλαδή 10MB.
-
-Ερώτηση 30:
------------
-Έστω τα παρακάτω:
-user1@localhost:~$ w
-USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
-user1 pts/0 1.2.3.4 03:34 0.00s 0.38s 0.01s w
-user2 pts/1 5.6.7.8 03:45 0.00s 0.38s 0.01s ls
-user3 pts/2 9.7.5.3 03:57 0.00s 0.38s 0.01s ps
-
-user1@localhost:~$ ls -al /dev/pts/*
-crw--w---- 1 user1 tty136, 0 Oct 25 04:04 /dev/pts/0
-crw--w--w- 1 user2 tty136, 1 Oct 25 04:04 /dev/pts/1
-crw--w--w- 1 user3 tty136, 2 Oct 25 04:04 /dev/pts/2
-
-Εξηγήστε τι είδους items του file system είναι τα παραπάνω,
-καθώς και τι θα κάνουν οι παρακάτω εντολές:
-user1@localhost:~$ cat > /dev/pts/1
-user1@localhost:~$ wall "test"
-
-Απάντηση:
-Σε ένα permission string, το 'c' δηλώνει ότι αυτό το item
-ειναι 'character device', το οποίο πρακτικά σημαίνει συσκευές
-οι οποίες μεταφέρουν δεδομένα σε μορφή κειμένου (bytes). Τέτοιες
-συσκευές είναι για παράδειγμα τα ηχεία. Στην προκειμένη περίπτωση
-το item ειναι 'tty' (από το teletype), δηλαδή είναι terminals. Τα
-συγκεκριμένα terminals ειναι συνδεδεμένα με το πληκτρολόγιο.
-
-Η εντολή 'cat > /dev/pts/1' θα εμφανίζει στο πρώτο terminal που
-ανοίχτηκε οτίδηποτε γράψουμε στο stdin. Στον κατάλογο /dev/pts/
-εμφανίζονται τα ανοιχτά terminals που τρέχουν αυτή τη στιγμή.
-
- $ cat > /dev/pts/1
-
- hello world
- hello world
-
-Η εντολή 'wall "test"' θα στείλει το μήνυμα "test" σε όλους τους
-συνδεδεμένους χρήστες.
-
- $ wall "test"
-
- Broadcast message from christos@freebsd (pts/1) (Wed Nov 14 23:26:58 2020):
-
- test
-
-
-Ερώτηση 31:
------------
-Δημιουργείστε τα αρχεία f1, f2, f3, f4, f5, f6 ,f7 με τα εξής δικαιώματα:
-f1, 757
-f2, 313
-f3, 010
-f4, 642
-f5, 551
-f6, 133
-f7, 111
-Με χρήση της εντολής ls –l και διοχετεύοντας τα αποτελέσματά της στην εντολή
-egrep να βρείτε τα αρχεία όπου:
-a. To group έχει δικαιώματα r-x.
-b. Ο user και οι others έχουν ακριβώς τα ίδια δικαιώματα
-c. Ο user, το group και οι others έχουν τα ίδια δικαιώματα για write
-d. Ο user, το group και οι others έχουν τα ίδια δικαιώματα για write και execute
-e. To group και οι others έχουν τα ίδια δικαιώματα για read και execute
-
-Απάντηση:
-a) Το pattern που θα αναζητήσουμε είναι στο permission string να περιέχονται
-οποιοιδήποτε χαρακτήρες σε όλα τα πεδία αλλά πρέπει οπωσδήποτε τα permissions
-του group να είναι r-x. Το - στην αρχή το βάζουμε για να ψάξουμε μόνο αρχεία και όχι
-τυχόν directories.
-
- ls -l | egrep "^-...r-x..."
-
-Αποτέλεσμα εκτέλεσης της εντολής:
-
- -rwxr-xrwx 1 christos christos 0 Nov 14 22:16 f1
- -r-xr-x--x 1 christos christos 0 Nov 14 22:16 f5
-
-b) Θα φτιάξουμε τρία capture groups στα πεδια που βρισκονται τα permissions
-του user ώστε να ψάξουμε ό,τι αποθηκεύτηκε στις μεταβλητές 1, 2 και 3
-στο πεδίο που βρίσκονται τα permissions των others. Ένα capture group φτιάχνουμε
-βάζοντας () και γράφοντας μέσα τους το pattern που θέλουμε.
-
- ls -l | egrep "^-(.)(.)(.)...\1\2\3"
-
-Πιο αναλυτικά συμβαίνει το εξής:
-1. Θέλουμε το pattern να ξεκινάει με - ώστε να είναι αρχείο
-2. Αποθηκεύουμε τους 3 επόμενους χαρακτήρες στις μεταβλητές 1, 2, 3.
-3. Έχουμε φτάσει στο πεδίο του group, οπότε ψάχνουμε για οποιονδήποτε
-χαρακτήρα επειδή δεν μας νοιάζει σε αυτό το παράδειγμα τι permissions έχει το group.
-4. Тώρα είμαστε στο πεδίο των others. Εμφανίζουμε τις μεταβλητές 1, 2, 3
-(με την σειρά) οι οποίες έχουν κρατήσει κάθε permission του user.
-
-Αποτέλεσμα εκτέλεσης της εντολής:
-
- -rwxr-xrwx 1 christos christos 0 Nov 14 22:16 f1
- --wx--x-wx 1 christos christos 0 Nov 14 22:16 f2
- ------x--- 1 christos christos 0 Nov 14 22:16 f3
- ---x--x--x 1 christos christos 0 Nov 14 22:16 f7
-
-c) Με την ίδια λογική όπως στο ερώτημα b, απλώς αυτή τη φορά δεν θα κρατήσουμε όλα τα
-permissions του user, αλλά μόνο τα permissions για write.
-
- ls -l | egrep "^-.(.)..\1..\1."
-
-Αποτέλεσμα εκτέλεσης της εντολής:
-
- ------x--- 1 christos christos 0 Nov 14 22:16 f3
- -r-xr-x--x 1 christos christos 0 Nov 14 22:16 f5
- ---x--x--x 1 christos christos 0 Nov 14 22:16 f7
-
-d) Ξανά με την ίδια λογική, αλλά κρατήσουμε τα πεδία για write και execute.
-
- ls -l | egrep "^-.(.)(.).\1\2.\1\2"
-
-Αποτέλεσμα εκτέλεσης της εντολής:
-
- -r-xr-x--x 1 christos christos 0 Nov 14 22:16 f5
- ---x--x--x 1 christos christos 0 Nov 14 22:16 f7
-
-e) Αυτή τη φορά θα κρατήσουμε στις μεταβλητές τα permissions από το group, και όχι
-από τον user.
-
- ls -l | egrep "^-...(.).(.)\1.\2"
-
-Αποτέλεσμα εκτέλεσης της εντολής:
-
- -rwxr-xrwx 1 christos christos 0 Nov 14 22:16 f1
- --wx--x-wx 1 christos christos 0 Nov 14 22:16 f2
- ---x-wx-wx 1 christos christos 0 Nov 14 22:16 f6
- ---x--x--x 1 christos christos 0 Nov 14 22:16 f7
-
-Ερώτηση 32:
------------
-Υποθέστε πως οι γραμμές στο αρχείο /etc/passwd είναι όμοιες με την παρακάτω:
-
-spouneri:x:2107:1067:Pouneridis Sokratis:/home/student/e2021/spouneri:/bin/bash
-
-Στο πέμπτο πεδίο θα υπάρχει πάντα πρώτο το επίθετο και μετά το όνομα του χρήστη.
-Μόνο ένα επίθετο και μόνο ένα όνομα, γραμμένα με λατινικούς χαρακτήρες κεφαλαίους
-ή/και πεζούς.
-
-Τα υπόλοιπα πεδία θα είναι γραμμένα πάντα με πεζούς λατινικούς
-χαρακτήρες.
-
-Ελέγχοντας το αρχείο /etc/passwd και κάνοντας χρήση της εντολής egrep
-βρείτε όλους τους (υποθετικούς) χρήστες του συστήματος όπου:
-
-a. Χρησιμοποιούν για κέλυφος το bash
-b. To HOME DIRECTORY τους βρίσκεται στον κατάλογο /home
-c. To UID τους είναι ίδιο μετο GID τους
-d. Τουλάχιστον τα 5 πρώτα γράμματα του επιθέτου τους αποτελούν μέρος και του username τους
-e. Τουλάχιστον τα 3 πρώτα γράμματα του επιθέτου τους και τα 3 πρώτα γράμματα του
-ονόματός τους αποτελούν μέρος και του username τους.
-
-Απάντηση:
-
-===================================================================
-===================================================================
-32
-===================================================================
-===================================================================
+# Eργαστήριο ΛΣ 1 / Άσκηση 1 / 2020-21
+# Ονοματεπώνυμο: Χρήστος Μαργιώλης
+# ΑΜ: [REDACTED]
+# ====================================
+#
+# Ερώτηση 1:
+# ----------
+# Δημιουργήστε στον τρέχοντα κατάλογο το αρχείο 'ask1.txt' με τα ακόλουθα
+# περιεχόμενα(όνομα, επώνυμο, username, ΤΚ, περιοχή, τηλ.), και εμφανίστε
+# το στησυνέχεια στην οθόνη, με αριθμημένες τις γραμμές του.
+#
+# Απάντηση:
+# Προκειμένου να δημιουργήσουμε ένα αρχείο χρησιμοποιούμε την εντολή 'touch [FILE...]',
+# όπου FILE είναι το όνομα του αρχείου και ... ότι μπορούμε να δώσουμε όσα ορίσματα
+# θελουμε. Στην προκειμένη περίπτωση
+
+touch ask1.txt
+
+# Αν και θα μπορούσαμε να γράψουμε τα δεδομένα του αρχείο σε έναν
+# κειμενογράφο, χρησιμοποιώντας την 'echo' (και οποιαδηποτε παρόμοια εντολή,
+# όπως την 'printf'), μπορούμε να ανακατευθύνουμε την έξοδο της στο αρχείο που θέλουμε,
+# οπότε μπορούμε με τις παρακάτω εντολές να έχουμε το ίδιο αποτέλεσμα.
+# Για χάρην απλότητας στο διάβασμα επέλεξα να καλέσω αρκετές φορές την 'echo' αντί να
+# ενώσω τα πάντα με newlines. Από την δεύτερη κλήση της και μετά το >> σημαίνει
+# ότι θέλουμε να γράψουμε στο τέλος του αρχείο, όχι να γράψουμε το αρχείο από την αρχή.
+
+echo "George Pappas george2 12136 Peristeri-------" > ask1.txt
+echo "Nick Nikolaoy nick23 12232 Aigaleo 5314555" >> ask1.txt
+echo "George Georgioy george583 11132 Athens-------" >> ask1.txt
+echo "Helen Georgioy helen3 12136 Peristeri 5748456" >> ask1.txt
+echo "Nick Pappas nick4 11223 Aigaleo 5324123" >> ask1.txt
+echo "Helen Ioannoy helen367 13222 Athens" ------- >> ask1.txt
+echo "Helen Thanoy helen36 11132 Peristeri9718345" >> ask1.txt
+echo "Vasilis Mamalis vas32 12345 Dafni 9738383" >> ask1.txt
+
+# Για να εμφανίσουμε τα περιεχόμενα του αρχείου με αριθμημένες σειρές,
+# θα χρησιμοποιηθεί η εντολή 'nl', η οποία αριθμεί σειρές, δέχοντας ως
+# input το αρχείο με τα περιεχόμενα.
+
+nl ask1.txt
+
+# Αποτέλεσμα εκτέλεσης εντολής:
+#
+# 1 George Pappas george2 12136 Peristeri-------
+# 2 Nick Nikolaoy nick23 12232 Aigaleo 5314555
+# 3 George Georgioy george583 11132 Athens-------
+# 4 Helen Georgioy helen3 12136 Peristeri 5748456
+# 5 Nick Pappas nick4 11223 Aigaleo 5324123
+# 6 Helen Ioannoy helen367 13222 Athens -------
+# 7 Helen Thanoy helen36 11132 Peristeri9718345
+# 8 Vasilis Mamalis vas32 12345 Dafni 9738383
+#
+# Ερώτηση 2:
+# ----------
+# Τρέξτε την εντολή cal -3 > calfile.txt και εξηγείστε τι ακριβώς κάνει.
+#
+# Απάντηση:
+# Η εντολή 'cal' αρχικά εμφανίζει ημερολόγιο του τρέχοντος μήνα. Με την
+# εντολή
+
+cal -3 > calfile.txt
+
+# Θα εμφανιστεί ο προηγούμενος, τρέχων και επόμενος μήνας, και στην συνέχεια
+# το output της εντολής θα γραφτεί στο αρχείο calfile.txt
+#
+# Ερώτηση 3:
+# ----------
+# Συνενώστε τα αρχεία calfile.txt και ask1.txt σε ένα αρχείο με όνομα full.txt
+#
+# Απάντηση:
+# Για την συνένωση των δύο παραπάνω αρχείων - και γενικότερα δύο ή παραπάνω
+# αρχειών - χρησιμοποιούμε την εντολή 'cat', οπότε
+
+cat calfile.txt ask1.txt > full.txt
+
+# Ερώτηση 4:
+# ----------
+# Εμφανίστε στην οθόνη τα πέντε πιο πρόσφατα τροποποιημένα αρχεία του καταλόγου σας.
+#
+# Απάντηση:
+# Για να εμφανίσουμε τα αρχεία του καταλόγου χρησιμοποιούμε την εντολή 'ls'.
+# Προκειμένου να εμφανιστούν κατά ημερομηνία τροποποίησης ενεργοποιούμε την
+# επιλογή -t. Έπειτα θα κάνουμε pipe το output του 'ls' στην εντολή 'head' για να
+# εμφανίσουμε μόνο τα 5 πρώτα αρχεία.
+
+ls -t | head -6
+
+# Ερώτηση 5:
+# ----------
+# Δημιουργήστε έναν κατάλογο με όνομα 'mydir1'. Μεταβείτε σε αυτόν και στη
+# συνέχεια αντιγράψτε εκεί (χωρίς να αλλάξετε κατάλογο) το αρχείο 'full.txt'
+# (από το γονικό κατάλογο). Μετονομάστε το εν συνεχεία σε 'new.txt'.
+# Επιστρέψτε στο γονικό κατάλογο. Διαγράψτε τον κατάλογο 'mydir1' και τα
+# περιεχόμενά του.
+#
+# Απάντηση:
+# Οι εντολές που θα χρειαστούμε είναι οι εξής:
+# mkdir Δημιουργεί κατάλογο
+# cd Αλλάζει κατάλογο
+# cp Αντιγράφει αρχεία και καταλόγους
+# rm -rf Διαγράφει αναδρομικά έναν κατάλογο (εφόσον υπάρχει το -rf)
+#
+# Στην πρώτη σειρά, το && σημαίνει ότι η επόμενη εντολή θα εκτελεστεί
+# μόνο αν η προηγούμενη εντολή εκτελεστεί επιτυχώς. Στην δεύτερη σειρά
+# το '.' δηλώνει τον κατάλογο που βρισκόμαστε - το '..' δηλώνει
+# τον γονικό κατάλογο.
+
+mkdir mydir1 && cd mydir1
+cp ../full.txt .
+cd ..
+rm -rf mydir1
+
+# Ερώτηση 6:
+# ----------
+# Δώστε τις εντολές που θα εμφανίσουν:
+# (α) όλα τα αρχεία του καταλόγου /usr με πληροφορίες για το inode τους και
+# το μέγεθος τους σε blocks.
+# (β) όλα τα περιεχόμενα του δέντρου καταλόγων και υποκαταλόγων (αναδρομικά)
+# που βρίσκονται κάτω από τον κατάλογο /usr, με πλήρεις πληροφορίες για
+# κάθε ένα από αυτά και εμφανιζόμενα σταδιακά, σελίδα προς σελίδα.
+#
+# Απάντηση:
+# Και στα δύο υποερωτήματα θα χρησιμοποιηθεί η εντολή 'ls'
+# (α) Η επιλογή -i εμφανίζει το inode και η επιλογή
+# -s το μέγεθος σε blocks, οπότε
+
+ls -lsi /usr
+
+# (β) Η επιλογή -R εμφανίζει αναδρομικά όλα τα περιεχόμενα ενός
+# καταλόγου, οπότε
+
+ls -lR /usr
+
+# Ερώτηση 7:
+# ----------
+# Δημιουργήστε έναν κατάλογο με όνομα 'testdir1'. Μεταβείτε σε αυτόν
+# και φτιάξτε εκεί ένα hard link (με το όνομα 'ask1link') προς το αρχείο
+# 'ask1.txt' του γονικού καταλόγου. Βεβαιωθείτε (δίνοντας την κατάλληλη
+# εντολή και εξηγώντας τι βλέπετε) ότι έχει δημιουργηθεί και ότι δεν είναι
+# symbolic (soft) link.
+#
+# Απάντηση:
+# Για να φτιάξουμε hard link θα χρησιμοποιήσουμε την εντολή 'ln'.
+
+mkdir testdir1 && cd testdir1
+ln ../ask1.txt ask1link
+
+# Αν εκτελέσουμε την εντολή 'ls -li' στον κατάλογο testdir1 θα δούμε
+# ότι σε αντίθεση με το soft link, στο hard link δεν εμφανίζεται
+# το -> το οποίο δηλώνει ότι είναι symbolic link.
+#
+# 11403520 -rw-r--r-- 2 christos wheel 350 Nov 11 12:28 ask1link
+#
+# Επίσης παρατηρούμε ότι και το ask1link αλλά και το ask1.txt έχουν το ίδιο inode.
+#
+# 11403520 -rw-r--r-- 2 christos wheel 350 Nov 11 12:28 ask1.txt
+# 11403520 -rw-r--r-- 2 christos wheel 350 Nov 11 12:28 ask1link
+#
+# Ερώτηση 8:
+# ----------
+# Μπείτε στο αρχείο 'ask1link' και διαγράψτε την τελευταία του γραμμή.
+# Βεβαιωθείτε στη συνέχεια ότι η αλλαγή αυτή έχει γίνει και στο αρχείο 'ask1.txt'.
+#
+# Απάντηση:
+# Εφόσον το ask1link ειναι hardlink στο 'ask1.txt', δηλαδή είναι reference
+# στο 'ask1.txt', ό,τι αλλαγή γίνει στο ένα αρχείο, θα γίνει και στο άλλο,
+# οπότε αν διαγράψουμε την τελευταία γραμμή από το 'ask1link', η αλλαγή
+# πράγματι θα έχει γίνει και στο 'ask1.txt'. Ανοίγουμε το 'ask1link' στο
+# Vim και εκτελούμε τις εξής εντολές ώστε να σβήσουμε την τελευταία γραμμή
+
+# vim ask1link
+
+# G πάει στην τελευταία γραμμή
+# dd την σβήνει
+# ZZ βγαίνουμε από το Vim
+#
+# Τώρα κάνοντας
+
+cd ..
+diff ask1.txt testdir1/ask1link
+
+# βλέπουμε ότι εντολή δεν βγάζει output, το οποίο σημαίνει ότι τα αρχεία
+# είναι ίδια, οπότε η αλλαγή που κάναμε στο ένα αρχείο ίσχυσε και στο άλλο.
+#
+# Ερώτηση 9:
+# ----------
+# Δημιουργήστε ένα κατάλογο kat1 και μέσα σε αυτόν δύο αρχεία, file1 και file2,
+# με περιεχόμενο τη λέξη 'one' το ένα και τη λέξη 'two' το άλλο.
+# Τρέξτε (μέσα στον κατάλογο kat1) την εντολή 'cp *' και εξηγήστε το αποτέλεσμα.
+# Στη συνέχεια τρέξτε την εντολή 'mv *' και εξηγήστε το αποτέλεσμα.
+#
+# Απάντηση:
+# Αρχικά πρέπει να γράψουμε τα περιέχομενα στα κατάλληλα αρχεία.
+
+mkdir kat1 && cd kat1
+echo "one" > file1
+echo "two" > file2
+
+# Αφού τρέξουμε την εντολή 'cp *' στον kat1 θα παρατηρήσουμε ότι και τα
+# δύο αρχεία τώρα έχουν την λέξη "one".
+
+cp *
+cat file1 file2
+
+# one
+# one
+#
+# Αυτό γίνεται επειδή γράφοντας 'cp *', επιλέγουμε όλα τα αρχεία του
+# καταλόγου. Επειδή όμως έχουμε δύο αρχεία η εντολή θα αναπτυχθεί σε
+#
+# cp file1 file2
+#
+# και αυτό που θα γίνει τελικά είναι να αντιγραφεί το file1 στο file2.
+# Όταν τρέξουμε την εντολή 'mv *' θα δούμε ότι διαγράφεται το file1,
+# επειδή, όπως και με την 'cp *', η εντολή θα αναπτυχθεί σε
+
+mv file1 file2
+ls
+cd ..
+
+# οπότε το file1 θα μετονομαστεί σε file2, και έτσι θα χαθεί.
+#
+# Ερώτηση 10:
+# -----------
+# Εμφανίστε τις γραμμές του αρχείου 'ask1.txt' οι οποίες τελειώνουν
+# με ένα ή περισσότερα συνεχόμενα ψηφία.
+#
+# Απάντηση:
+# Η εντολή 'grep' δέχεται ένα regular expression (regex) και επιστρέφει
+# τις γραμμές στο αρχείο στις οποίες βρίσκεται το regex.
+# Το regex που θα ψάξουμε θα αποτελείται από τα εξής μέρη:
+#
+# 1. [0-9] οποιδήποτε ψηφίο από το 0 εώς το 9
+# 2. \+ μία ή παραπάνω επαναλήψεις του προηγούμενου
+# 3. $ τέλος γραμμής
+#
+# Οπότε η τελική εντολή θα είναι
+
+grep "[0-9]\+$" ask1.txt
+
+# Ερώτηση 11:
+# -----------
+# Εμφανίστε τις γραμμές του αρχείου 'ask1.txt' οι οποίες περιέχουν μεν
+# το πρότυπο 'Pap' αλλά δεν περιέχουν το πρότυπο 'Aig'.
+#
+# Απάντηση:
+# Στην εντολή 'grep' η επιλογή -v αποκλείει το δοθέν regex. Προκειμένου
+# πρώτα να πάρουμε τις γραμμές που περιέχουν το πρότυπο 'Pap' αλλα όχι
+# το πρότυπο 'Aig', θα εκτελέσουμε το 'grep' 2 φορές, ώστε πρώτα να πάρουμε
+# όλες τις γραμμές που περιέχουν το 'Pap' και μετά να αποκλείσουμε το 'Aig'.
+
+grep "Pap" ask1.txt | grep -v "Aig"
+
+# Ερώτηση 12:
+# -----------
+# Εμφανίστε τις γραμμές του αρχείου 'ask1.txt' οι οποίες δεν αρχίζουν
+# με 'G' ή 'N' και περιέχουν εν συνεχεία (κάπου στα περιεχόμενά τους)
+# τα πρότυπα 'Geo' και 'Per' με αυτή τη σειρά.'
+#
+# Aπάντηση:
+# Όπως και στην ερώτηση 11, θα μπορούσαμε να χρησιμοποιήσουμε την επιλογή
+# -v για την εντολή 'grep', αλλα θα χρησιμοποιήσουμε μία διαφορετική σύνταξη.
+# Αυτή τη φορά τα regex που θα ψάξουμε είναι τα εξής
+#
+# Για την πρώτη κλήση:
+# 1. ^ ξεκινάει με
+# 2. ^[GN] πρεπει να ξεκινάει με G ή N
+# 3. ^[^GN] ΔΕΝ πρέπει να ξεκινάει με G ή N
+#
+# Για την δεύτερη κλήση:
+# 1. Geo περιέχει την λέξη 'Geo'
+# 2. .* οποιοσδήποτε αριθμός οποιουδήποτε χαρακτήρα
+# 3. Per περιέχει την λέξη 'Per'
+#
+# Οπότε η τελική εντολή είναι (το | ειναι separator)
+
+grep "^[^GN]" ask1.txt | grep "Geo.*Per"
+
+# Αποτέλεσμα εκτέλεσης εντολής:
+#
+# Helen Georgioy helen3 12136 Peristeri 5748456
+#
+# Ερώτηση 13:
+# -----------
+# Πόσοι χρήστες που το username τους δεν αρχίζει από 'ls1' είναι
+# συνδεδεμένοι στο σύστημα;
+#
+# Απάντηση:
+# Η εντολή 'who' μπορεί να μας επιστρέψει μια λίστα με τους χρήστες
+# που είναι συνδεδεμένοι. Ο λόγος που χρησιμοποίησα την 'who' αντί
+# για την 'w' που κάνει περίπου το ίδιο πράγμα είναι επειδή η 'w'
+# έχει και μια γραμμή header στην αρχή, οπότε 'wc -l' θα την μέτραγε.
+# Με την χρήση της εντολής 'wc' μπορούμε να μετρήσουμε λέξεις, γραμμές
+# και χαρακτήρες. Αν στην εντολή 'wc' δώσουμε την επιλογή -l τότε θα
+# μετρήσει μόνο πόσες γραμμές έχει το input που της δώθηκε.
+
+who | grep -v "^ls1" | wc -l
+
+# Ερώτηση 14:
+# -----------
+# Εμφανίστε όλες τις διεργασίες χρηστών (αλλ/σης) που τρέχουν αυτή
+# τη στιγμή στο σύστημα.
+#
+# Απάντηση:
+# Η εντολή 'ps' (process status) εμφανίζει τις τρέχουσες διεργασίες που
+# εκτελεί το σύστημα. Επιπλέον θα χρειαστούμε τις επιλογές a και u, οι οποίες
+# εμφανίζουν τις διεργασίες που εκτελούνται από όλους τους συνδεδεμένους χρήστες
+# αυτή τη στιγμη. Στην εντολή 'ps' χρησιμοποιήσα την BSD σύνταξη.
+
+ps -au
+
+# Αποτέλεσμα εκτέλεσης της εντολής:
+#
+# USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
+# christos 5200 0.1 0.1 18048 7084 2 Ss 21:44 0:09.04 /usr/local/bin/zsh
+# christos 1160 0.0 0.1 15072 6016 v0 I 12:19 0:00.07 -zsh (zsh)
+# christos 1175 0.0 0.0 11828 3044 v0 I+ 12:19 0:00.00 /bin/sh /usr/local/bin/startx
+# christos 1188 0.0 0.0 13164 3240 v0 I+ 12:19 0:00.00 xinit /home/christos/.xinitrc
+# christos 1192 0.0 0.1 22152 11360 v0 S 12:19 0:19.69 dwm
+# christos 1218 0.0 0.1 17136 8000 0- S 12:20 0:16.20 slstatus
+# christos 5005 0.0 0.1 18004 7000 1 Is 21:15 0:00.31 /usr/local/bin/zsh
+# christos 5193 0.0 0.2 28028 16288 1 S+ 21:44 0:07.88 nvim ex1.txt
+# christos 6849 0.0 0.0 11860 3080 2 R+ 00:22 0:00.00 ps -u
+# root 1158 0.0 0.0 10880 2304 v1 Is+ 13:14 0:00.00 /usr/libexec/getty Pc ttyv1
+# root 1159 0.0 0.0 10880 2304 v2 Is+ 13:14 0:00.00 /usr/libexec/getty Pc ttyv2
+# root 1160 0.0 0.0 10880 2304 v3 Is+ 13:14 0:00.00 /usr/libexec/getty Pc ttyv3
+#
+# Ερώτηση 15:
+# -----------
+# Πόσες διεργασίες χρηστών (αλλ/σης) τρέχουν στο σύστημα και τελειώνει
+# το όνομά τους με 'sh' ?
+#
+# Απάντηση:
+# Τρέχοντας την εντολή της ερώτησης 14 (ps -ux) και φιλτράροντας
+# το ouput ώστε να πάρουμε μόνο τις γραμμές που τελειώνουν σε
+# 'sh', έχω 3 διεργασίες που το όνομα τους τελειώνει σε 'sh'
+
+ps -au | grep "sh$" | wc -l
+
+# Συνολικά έχουμε 3 διεργασίες που τελειώνουν σε sh.
+#
+# Ερώτηση 16:
+# -----------
+# Εμφανίστε όλες τις διεργασίες χρηστών (αλλ/σης) που τρέχουν αυτή τη στιγμή στο σύστημα.
+#
+# Απάντηση:
+# Αυτή τη φορά στην εντολή 'ps', πέρα από την επιλογή u, θα δώσουμε και την επιλογή
+# x, η οποία εμφναίζει πληροφορίες ακόμα και για διεργασίες που δεν ελέγχουν κάποιο terminal
+
+ps -aux
+
+# Το output της εντολής είναι πολύ μεγάλο για να το συμπεριλάβω εδώ.
+#
+# Ερώτηση 17:
+# -----------
+# Πόσα αρχεία του τρέχοντος καταλόγου σας (μόνο του τρέχοντος -όχι και
+# των υποκαταλόγων του) έχουν permissions 'rw' από τους πάντες και 'x'
+# από κανέναν;
+#
+# Απάντηση:
+# Η 'ls -l' στην αρχή κάθε σειράς εμφανίζει το permission string και με την
+# 'grep' μπορούμε να εμφανίσουμε μόνο τις γραμμές που περιέχουν το permission
+# που ζητάει η εκφώνηση. Τέλος διοχετεύουμε την έξοδο στην 'wc -l'.
+
+ls -l | grep "^-rw-rw-rw-" | wc -l
+
+# Ερώτηση 18:
+# -----------
+# Βρείτε τους καταλόγους του συστήματος που το όνομά τους αρχίζει από 'b'.
+#
+# Απάντηση:
+# Η εντολή 'find' είναι μια πιο ανεπτυγμένη μορφή της 'ls' στην οποία μπορούμε
+# να δώσουμε πολλές παραπάνω επιλογές. Οι επιλογές που έχουν δωθεί στην παρακάτω εντολή
+# σημαίνουν τα εξής:
+# /* - η αναζήτηση ξεκινάει από την ρίζα του συστήματος (root directory)
+# -type d - αναζήτηση μόνο για directories
+# -name "b*" - το όνομα τους πρέπει να ξεκινάει από 'b'
+
+find /* -type d -name "b*"
+
+# Ερώτηση 19:
+# -----------
+# Να βρείτε και να παρουσιάσετε στην οθόνη με πλήρεις πληροφορίες
+# όλα τα αρχεία με όνομα που αρχίζει από tty και βρίσκονται στον κατάλογο /dev.
+#
+# Απάντηση:
+# Η εντολή stat επιστρέφει πλήρεις πληροφορίες για ένα αρχείο.
+# Με την εντολή 'grep', όπως έχει ειπωθεί και σε παραπάνω ερωτήσεις, μπορούμε
+# να πάρουμε τις γραμμές στις οποίες γίνεται match ένα regular
+# expression - έτσι κατά την εμφάνιση των αρχείων του /dev μπορούμε
+# να εξάγουμε μόνο όσες γραμμές περιέχουν την λέξη 'tty'.
+
+stat /dev/* | grep "tty"
+
+# Ερώτηση 20:
+# -----------
+# Ταξινομήστε τα περιεχόμενα του αρχείου 'ask1.txt' ως προς το
+# username σε φθίνουσα σειρά.
+#
+# Απάντηση:
+# Θα ταξινομίσουμε το αρχείο με την χρήση της εντολής 'sort'.
+# Στην εντολή αυτή μπορούμε να της δώσουμε κατα ποιά στήλη θέλουμε
+# να ταξινομηθεί το αρχείο με την επιλογή -k. Εφόσον username
+# βρίσκεται στην 3η στήλη, θα δώσουμε την 3η στήλη ως μέσο
+# σύγκρισης για ταξινόμηση. Επίσης, προκειμένου να είναι κατα
+# φθήνουσα σειρά η ταξινόμηση, θα χρησιμοποιήσουμε την επιλογή -r
+
+sort -rk 3 ask1.txt
+
+# Σε περίπτωση που θέλουμε οι αλλαγές να γραφτούν στο αρχείο, μπορούμε
+# να γράψουμε την εντολή ως
+#
+# sort -rk 3 ask1.txt -o ask1.txt
+#
+# Ερώτηση 21:
+# -----------
+# Ταξινομήστε τα '.c' αρχεία του καταλόγου στον οποίον δουλεύετε ως
+# προς το μέγεθός τους.
+#
+# Απάντηση:
+# Στην εντολή 'ls' η επιλογή -S ταξινομεί τα αρχεία ανάλογα με το
+# μέγεθός του κατα φθήνουσα σειρά (μεγαλύτερο πρώτα), οπότε
+
+ls -S *.c
+
+# Ερώτηση 22:
+# -----------
+# Ταξινομήστε τα αρχεία του λογαριασμού σας με permissions 644
+# ως προς το μέγεθός τους.
+#
+# Απάντηση:
+# Μπορούμε να εμφανίσουμε αρχεία που έχουν συγκεκριμένα permissions
+# με την εντολή 'find' και την επιλογή -perm [PERMISSION] όπου
+# το PERMISSION πρέπει να δωθεί σε οκταδικό. Επίσης μέσα στην 'find'
+# μπορούμε να εκτελέσουμε και επιπλέον shell commands στο output της με
+# την επιλογή -exec [COMMAND] - θα χρησιμοποιήσουμε την 'ls -alS' ώστε
+# να ταξινομήσει το output κατα μέγεθος. Η τελική εντολή θα εκτελεστεί
+# στον κατάλογο '/usr/home/christos', ο οποίος είναι ο κατάλογος του λογαριασμού
+# μου. Το {} \; στο τέλος της εντολής δηλώνει ότι η 'ls -alS' θα εκτελεστεί
+# σε κάθε αρχείο που βρίσκεται από την 'find'.
+
+find /home/christos -perm 644 -exec ls -alS {} \;
+
+# Ερώτηση 23:
+# -----------
+# Ταξινομήστε όλα τα περιεχόμενα του καταλόγου /dev κατά πρώτον ως προς
+# τον owner και κατά δεύτερον ως προς το group και αποθηκεύστε το
+# output στο αρχείο 'binfiles.txt'.
+#
+# Аπάντηση:
+# Παίρνοντας πληροφορίες για τον owner και το group των αρχείων με την
+# 'ls -l /dev' μπορούμε να ταξινομήσουμε τις κατάλληλες στήλες (3 για owner
+# και 4 για group).
+
+ls -l /dev | sort -k 3,4 > binfiles.txt
+
+# Ερώτηση 24:
+# -----------
+# Φτιάξτε ένα αρχείο που θα περιέχει πληροφορίες μόνο για τους συνδεδεμένους
+# χρήστες που το username τους αρχίζει από 'ls1', ταξινομημένο ως προς
+# την ημερομηνία και ώρα σύνδεσή τους.
+#
+# Απάντηση:
+# ΑΦού φιλτραριστεί το ouput της 'who' ώστε να πάρουμε μόνο τους
+# χρήστες που το όνομά τους ξεκινάει από ls1, θα ταξινομήσουμε
+# κατά 3η και 4η στήλη επειδή αυτές δείχνουν την ημερομηνία
+# και ώρα σύνδεσης.
+
+who | grep "^ls1" | sort -k 3,4 > userinfo.txt
+
+# Ερώτηση 25:
+# -----------
+# Αλλάξτε στο αρχείο 'ask1.txt' το όνομα 'Nick' (όπου συναντάται) σε 'Nickolaos'.
+#
+# Απάντηση:
+# Με την χρήση της εντολής 'sed' (stream editor) μπορούμε να αλλάξουμε ένα
+# pattern κάθε φορά που συναντάται με την παρακάτω σύνταξη
+#
+# sed "s/PATTERN/NEWPATTERN/g" file
+#
+# Τo g στο τέλος σημαίνει ότι αυτή η αλλαγή πρέπει να γίνει σε όλο το αρχείο,
+# και όχι μόνο την πρώτη φορά που θα συναντήσει το PATTERN.
+# Οπότε, στην προκειμένη περίπτωση η εντολή που θα εκτελεστεί είναι
+
+sed "s/Nick/Nickolaos/g" ask1.txt
+
+# Εάν θέλουμε οι αλλαγές να αποθηκευτούν στο αρχείο κατευθείαν, μπορούμε
+# να εκτελέσουμε την εντολή με την επιλογή -i.
+
+sed -i "s/Nick/Nickolaos/g" ask1.txt
+
+# Ερώτηση 26:
+# -----------
+# Έστω τα ακόλουθα items του filesystem με protection strings:
+# (α) '-rwxr-x--x',
+# (β) 'drwxr-x---' και
+# (γ) 'drwx--x--x.
+# Εξηγείστε τι είδους items είναι και ποια τα δικαιώματα πρόσβασης user,
+# group και others σε αυτά.
+#
+# Απάντηση:
+# (α) Το είδος item είναι απλό αρχείο εφόσον το πρώτο πεδίο του protection string
+# είναι κενό. Όσο αφορά τα δικαίωματα του, δικαίωμα εγγραφής έχει μόνο ο ιδιοκτήτης
+# του αρχείο, διαβάσματος ο ιδιοκτήτης του αρχείου, και όσοι είναι στο ίδιο group με αυτόν.
+# Επίσης όλοι οι χρήστες μπορούνε να το εκτελέσουν.
+#
+# (β) Το είδος είναι directory λόγω του 'd' στο πρώτο πεδίο του string. Δικαίωμα εγγραφής
+# έχει μόνο ο ιδιοκτήτης, διαβάσματος και εκτέλεσης ο ιδιοκτήτης και τα μέλη του group -
+# οι υπόλοιποι χρήστες δεν έχουν δικαιώματα για το συγκεκριμένο directory.
+#
+# (γ) Το είδος είναι επίσης directory λόγω του 'd' στο πρώτο πεδίο του string. Δικαίωμα
+# εγγραφής και διαβάσματος έχει μόνο ο ιδιοκτήτης και εκτέλεσης όλοι οι χρήστες.
+#
+# Ερώτηση 27:
+# -----------
+# Αλλάξτε τα permissions όλων των αρχείων του καταλόγου 'testdir1'
+# έτσι ώστε να έχουν δικαίωμα εκτέλεσης και εγγραφής μόνο ο ιδιοκτήτης,
+# ενώ δικαίωμα ανάγνωσης να έχουν όλοι.
+#
+# Απάντηση:
+# Η εντολή 'chmod' μπορεί να αλλάξει permissions. Με την επιλογή 'R' δηλώνουμε
+# ότι αυτό θέλουμε να γίνει αναδρομικά εφόσον θέλουμε να αλλάξουμε τα permissions
+# όλων των αρχείων του καταλόγου 'testdir1'. Τα υπόλοιπα πεδία σημαίνουν τα εξής:
+# a=r - όλοι οι χρήστες έχουν δικαίωμα ανάγνωσης
+# u+wx - προσθέτουμε στον ιδιοκτήτη του αρχείου και τα δικαιώματα εγγραφής και εκτέλεσης
+
+sudo chmod -R a=r,u+wx testdir1
+
+# Ερώτηση 28:
+# -----------
+# Αλλάξτε τα permissions του καταλόγου 'testdir1' έτσι ώστε να έχουν δικαίωμα
+# πρόσβασης μόνο ο ιδιοκτήτης και οι χρήστες του ιδίου με αυτόν group,
+# ενώ οι υπόλοιποι χρήστες να μην έχουν (θεωρείστε ότι τα τρέχοντα
+# permissions του καταλόγου είναι 755).
+#
+# Απάντηση:
+# Χρησιμοποιώντας πάλι την εντολή 'chmod' μπορούμε να αλλάξουμε και τα permissions
+# ενός καταλόγου. Τα πεδία τώρα σημαίνουν τα εξής:
+# ug+r - ο ιδιοκτήτης και τα μέλη του group έχουν δικαίωμα διαβάσματος
+# o-r - οι υπόλοιποι χρήστες δεν έχουν δικαίωμα διαβάσματος
+
+sudo chmod ug+r,o-r testdir1
+
+# Ερώτηση 29:
+# -----------
+# Δημιουργήστε έναν νέο χρήστη στο σύστημά σας με username 'myfriend'.
+# Αλλάξτε στη συνέχεια τον ιδιοκτήτη του αρχείου 'ask1.txt' σε 'myfriend' και
+# μετακινήστε το στο working directory του. Περιορίστε τέλος το διαθέσιμο
+# χώρο αποθήκευσης στο δίσκο για το συγκεκριμένο χρήστη στα 10MB.
+#
+# Απάντηση:
+# Για να φτιάξουμε έναν user χρησιμοποιούμε την εντολή 'useradd'. Σε BSD
+# συστήματα η εντολή είναι η 'adduser'. Για να αλλάξουμε ιδιοκτήτη αρχείου
+# χρησιμοποιούμε την εντολή 'chown'. Τέλος, για να περιορίσουμε τον χώρο
+# αποθηκεύσης στον δίσκο για έναν χρήστη χρησιμοποιούμε την εντολή 'edquota'.
+
+useradd -m -d /home/myfriend myfriend
+chown myfriend ask1.txt
+mv ask1.txt /home/myfriend
+edquota myfriend
+
+# Η εντολή 'edquota' θα μάς ανοίξει στον default editor μας ένα αρχείο
+# στο οποίο μπορούμε να τροποποιήσουμε τον αποθηκευτικό χώρο για τον χρήστη
+# myfriend. Θα πρέπει να δούμε κάτι σαν
+#
+# Disk quotas for user ice19390133 (uid 1022):
+# Filesystem blocks soft hard inodes soft hard
+# /dev/vda1 36 10240 13312 11 0 0
+#
+# Το 'soft' το θέτουμε σε 10240 (kilobyte), δηλαδή 10MB.
+#
+# Ερώτηση 30:
+# -----------
+# Έστω τα παρακάτω:
+# user1@localhost:~$ w
+# USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
+# user1 pts/0 1.2.3.4 03:34 0.00s 0.38s 0.01s w
+# user2 pts/1 5.6.7.8 03:45 0.00s 0.38s 0.01s ls
+# user3 pts/2 9.7.5.3 03:57 0.00s 0.38s 0.01s ps
+#
+# user1@localhost:~$ ls -al /dev/pts/*
+# crw--w---- 1 user1 tty136, 0 Oct 25 04:04 /dev/pts/0
+# crw--w--w- 1 user2 tty136, 1 Oct 25 04:04 /dev/pts/1
+# crw--w--w- 1 user3 tty136, 2 Oct 25 04:04 /dev/pts/2
+#
+# Εξηγήστε τι είδους items του file system είναι τα παραπάνω,
+# καθώς και τι θα κάνουν οι παρακάτω εντολές:
+# user1@localhost:~$ cat > /dev/pts/1
+# user1@localhost:~$ wall "test"
+#
+# Απάντηση:
+# Σε ένα permission string, το 'c' δηλώνει ότι αυτό το item
+# ειναι 'character device', το οποίο πρακτικά σημαίνει συσκευές
+# οι οποίες μεταφέρουν δεδομένα σε μορφή κειμένου (bytes). Τέτοιες
+# συσκευές είναι για παράδειγμα τα ηχεία. Στην προκειμένη περίπτωση
+# το item ειναι 'tty' (από το teletype), δηλαδή είναι terminals. Τα
+# συγκεκριμένα terminals ειναι συνδεδεμένα με το πληκτρολόγιο.
+#
+# Η εντολή 'cat > /dev/pts/1' θα εμφανίζει στο πρώτο terminal που
+# ανοίχτηκε οτίδηποτε γράψουμε στο stdin. Στον κατάλογο /dev/pts/
+# εμφανίζονται τα ανοιχτά terminals που τρέχουν αυτή τη στιγμή.
+
+cat > /dev/pts/1
+
+# hello world
+# hello world
+#
+# Η εντολή 'wall "test"' θα στείλει το μήνυμα "test" σε όλους τους
+# συνδεδεμένους χρήστες.
+
+wall "test"
+
+# Broadcast message from christos@freebsd (pts/1) (Wed Nov 14 23:26:58 2020):
+#
+# test
+#
+#
+# Ερώτηση 31:
+# -----------
+# Δημιουργείστε τα αρχεία f1, f2, f3, f4, f5, f6 ,f7 με τα εξής δικαιώματα:
+# f1, 757
+# f2, 313
+# f3, 010
+# f4, 642
+# f5, 551
+# f6, 133
+# f7, 111
+# Με χρήση της εντολής ls –l και διοχετεύοντας τα αποτελέσματά της στην εντολή
+# egrep να βρείτε τα αρχεία όπου:
+# a. To group έχει δικαιώματα r-x.
+# b. Ο user και οι others έχουν ακριβώς τα ίδια δικαιώματα
+# c. Ο user, το group και οι others έχουν τα ίδια δικαιώματα για write
+# d. Ο user, το group και οι others έχουν τα ίδια δικαιώματα για write και execute
+# e. To group και οι others έχουν τα ίδια δικαιώματα για read και execute
+#
+# Απάντηση:
+# Αρχικά θα δημιουργήσουμε τα αρχεία με τα κατάλληλα permissions
+
+touch f1 && chmod 757 f1
+touch f2 && chmod 313 f2
+touch f3 && chmod 010 f3
+touch f4 && chmod 642 f4
+touch f5 && chmod 551 f5
+touch f6 && chmod 133 f6
+touch f7 && chmod 111 f7
+
+# a) Το pattern που θα αναζητήσουμε είναι στο permission string να περιέχονται
+# οποιοιδήποτε χαρακτήρες σε όλα τα πεδία αλλά πρέπει οπωσδήποτε τα permissions
+# του group να είναι r-x. Το - στην αρχή το βάζουμε για να ψάξουμε μόνο αρχεία και όχι
+# τυχόν directories.
+
+ls -l | egrep "^-...r-x..."
+
+# Αποτέλεσμα εκτέλεσης της εντολής:
+#
+# -rwxr-xrwx 1 christos christos 0 Nov 14 22:16 f1
+# -r-xr-x--x 1 christos christos 0 Nov 14 22:16 f5
+#
+# b) Θα φτιάξουμε ένα capture group στα πεδια που βρισκονται τα permissions
+# του user ώστε να ψάξουμε ό,τι αποθηκεύτηκε στην μεταβλητή 1
+# στο πεδίο που βρίσκονται τα permissions των others. Ένα capture group φτιάχνουμε
+# βάζοντας () και γράφοντας μέσα το pattern που θέλουμε.
+
+ls -l | egrep "^-(...)...\1"
+
+# Πιο αναλυτικά συμβαίνει το εξής:
+# 1. Θέλουμε το pattern να ξεκινάει με - ώστε να είναι αρχείο.
+# 2. Αποθηκεύουμε τους 3 επόμενους χαρακτήρες στη μεταβλητή 1.
+# 3. Έχουμε φτάσει στο πεδίο του group, οπότε ψάχνουμε για οποιονδήποτε
+# χαρακτήρα επειδή δεν μας νοιάζει σε αυτό το παράδειγμα τι permissions έχει το group.
+# 4. Тώρα είμαστε στο πεδίο των others. Εμφανίζουμε τη μεταβλητή 1 η οποία έχει κρατήσει
+# τα permissions του user.
+#
+# Αποτέλεσμα εκτέλεσης της εντολής:
+#
+# -rwxr-xrwx 1 christos christos 0 Nov 14 22:16 f1
+# --wx--x-wx 1 christos christos 0 Nov 14 22:16 f2
+# ------x--- 1 christos christos 0 Nov 14 22:16 f3
+# ---x--x--x 1 christos christos 0 Nov 14 22:16 f7
+#
+# c) Με την ίδια λογική όπως στο ερώτημα b, απλώς αυτή τη φορά δεν θα κρατήσουμε όλα τα
+# permissions του user, αλλά μόνο τα permissions για write.
+
+ls -l | egrep "^-.(.)..\1..\1."
+
+# Αποτέλεσμα εκτέλεσης της εντολής:
+#
+# ------x--- 1 christos christos 0 Nov 14 22:16 f3
+# -r-xr-x--x 1 christos christos 0 Nov 14 22:16 f5
+# ---x--x--x 1 christos christos 0 Nov 14 22:16 f7
+#
+# d) Ξανά με την ίδια λογική, αλλά κρατήσουμε τα πεδία για write και execute.
+
+ls -l | egrep "^-.(..).\1.\1"
+
+# Αποτέλεσμα εκτέλεσης της εντολής:
+#
+# -r-xr-x--x 1 christos christos 0 Nov 14 22:16 f5
+# ---x--x--x 1 christos christos 0 Nov 14 22:16 f7
+#
+# e) Αυτή τη φορά θα κρατήσουμε στις μεταβλητές τα permissions από το group, και όχι
+# από τον user.
+
+ls -l | egrep "^-...(.).(.)\1.\2"
+
+# Αποτέλεσμα εκτέλεσης της εντολής:
+#
+# -rwxr-xrwx 1 christos christos 0 Nov 14 22:16 f1
+# --wx--x-wx 1 christos christos 0 Nov 14 22:16 f2
+# ---x-wx-wx 1 christos christos 0 Nov 14 22:16 f6
+# ---x--x--x 1 christos christos 0 Nov 14 22:16 f7
+#
+# Ερώτηση 32:
+# -----------
+# Υποθέστε πως οι γραμμές στο αρχείο /etc/passwd είναι όμοιες με την παρακάτω:
+#
+# spouneri:x:2107:1067:Pouneridis Sokratis:/home/student/e2021/spouneri:/bin/bash
+#
+# Στο πέμπτο πεδίο θα υπάρχει πάντα πρώτο το επίθετο και μετά το όνομα του χρήστη.
+# Μόνο ένα επίθετο και μόνο ένα όνομα, γραμμένα με λατινικούς χαρακτήρες κεφαλαίους
+# ή/και πεζούς.
+#
+# Τα υπόλοιπα πεδία θα είναι γραμμένα πάντα με πεζούς λατινικούς
+# χαρακτήρες.
+#
+# Ελέγχοντας το αρχείο /etc/passwd και κάνοντας χρήση της εντολής egrep
+# βρείτε όλους τους (υποθετικούς) χρήστες του συστήματος όπου:
+#
+# a. Χρησιμοποιούν για κέλυφος το bash
+# b. To HOME DIRECTORY τους βρίσκεται στον κατάλογο /home
+# c. To UID τους είναι ίδιο μετο GID τους
+# d. Τουλάχιστον τα 5 πρώτα γράμματα του επιθέτου τους αποτελούν μέρος και του username τους
+# e. Τουλάχιστον τα 3 πρώτα γράμματα του επιθέτου τους και τα 3 πρώτα γράμματα του
+# ονόματός τους αποτελούν μέρος και του username τους.
+#
+# Απάντηση:
+#
+# a. Εφόσον το shell βρίσκεται πάντα στο τέλος της γραμμής, μπορούμε να κάνουμε
+
+egrep "/bin/bash$" /etc/passwd
+
+# b. Αφού φτάσουμε στο πεδίο όπου βρίσκεται το Home directory, θα φροντίσουμε
+# να εμφανιστούνε μόνο οι γραμμές που ξεκινάνε με '/home'.
+
+egrep "^[a-z]+:.+:[0-9]+:[0-9]+:.+:/home/*" /etc/passwd
+
+# c. Θα χρησιμοποιήσουμε την ίδια τεχνική με τα capture groups που χρησιμοποίησα
+# και στην άσκηση 31.
+
+egrep "^[a-z]+:.+:([0-9]+):\1" /etc/passwd
diff --git a/sh-os1/ex2/createpvs b/sh-os1/ex2/createpvs
@@ -0,0 +1,32 @@
+#!/bin/sh
+
+main() {
+ test $# -eq 4 || usage
+
+ rootdir=$1
+ ndbdirs=$2
+ ndatadirs=$3
+ username=$4
+
+ test -d "$rootdir" || err "$rootdir: no such directory"
+ isnumber $ndbdirs || err "'$ndbdirs' is not a number"
+ isnumber $ndatadirs || err "'$ndatadirs' is not a number"
+ test ! -z $(grep "$username" /etc/passwd) || err "'$username' is not in /etc/passwd"
+
+ # pending...
+}
+
+usage() {
+ echo "usage: ${0##*/} [ROOT_DIR] [N_DBDIRS] [N_DATADIRS] [USERNAME]" &&
+ exit 1
+}
+
+err() {
+ echo "${0##*/}: $1" && exit 1
+}
+
+isnumber() {
+ test ! -z $(echo "$1" | grep "^[0-9]\+$")
+}
+
+main "$@"
diff --git a/sh-os1/ex2/searching b/sh-os1/ex2/searching
@@ -1,7 +1,7 @@
#!/bin/sh
main() {
- test $# -eq 0 && usage
+ test $# -eq 2 || usage
isnumber $1
isnumber $2
diff --git a/sh-os1/ex2/teldb b/sh-os1/ex2/teldb
@@ -15,7 +15,7 @@ main() {
}
usage() {
- echo "usage: ${0##*/} [-a|-l|-s [COL]|-c [KEYWORD]|-d [KEYWORD [-b|-r]]|-n]"
+ echo "usage: ${0##*/} [-a|-l|-s COL|-c KEYWORD|-d KEYWORD [-b|-r]|-n]"
echo ""
echo "options:"
echo "-a add a new entry"
@@ -26,10 +26,12 @@ usage() {
echo " -b replace line with an empty line"
echo " -r remove line completely"
echo "-n count empty lines and ask if they should be deleted"
+
+ exit 1
}
errempty() {
- test -z "$1" && echo "${0##*/}: expected non-empty string" && exit 1
+ test -z "$1" && usage
}
skipempty() {