Test z Linuksa najlepiej sprawdza to, czy uczeń potrafi zamienić zadanie na polecenie: policzyć błędy w dzienniku, znaleźć najaktywniejszego użytkownika, odnaleźć pliki, skopiować i przenieść. Poniższy test składa się z trzech zadań, a jego klucz został wygenerowany skryptem uruchomionym w prawdziwym bashu na przygotowanych danych (wymyślony dziennik ośmiu zdarzeń i katalog raporty).
Test jest przeznaczony na 45 minut dla klasy po lekcjach o grep, sort, uniq i wc, find i przekierowaniach. Uczniowie wykonują polecenia w terminalu na kopii przygotowanych plików; skrypt tworzy dane w katalogu tymczasowym i na końcu sam sprząta.
Przygotowanie stanowisk
Potrzebny jest terminal z powłoką bash (Ubuntu, WSL lub maszyna wirtualna). Ćwiczenia wykonuj na zwykłym koncie, bez sudo. Skrypt rozwiazanie.sh z pakietu odtwarza całą lekcję w katalogu tymczasowym (mktemp -d) i usuwa tylko ten katalog — nie zmienia Twoich plików; uruchamiasz go poleceniem bash rozwiazanie.sh. Ćwiczenia z karty pracy wykonaj ręcznie w terminalu, w osobnym katalogu ćwiczeniowym.
Cele i plan lekcji
Po zajęciach uczeń potrafi:
- policzyć wiersze pasujące do wzorca (
grep -c,grep | wc -l); - zbudować potok z
awk,sort,uniqihead; - wyszukać pliki i katalogi poleceniem
find; - skopiować, przenieść i porównać pliki (
cp,mv,cmp).
| Czas | Praca na lekcji |
|---|---|
| 0–5 min | Instrukcja i dane |
| 5–35 min | Rozwiązywanie trzech zadań |
| 35–45 min | Samosprawdzenie z kluczem |
Dane
Plik dziennik.txt zawiera osiem zdarzeń w formacie godzina użytkownik zdarzenie [szczegół], a katalog raporty — pliki a.txt, b.txt, notatki.md oraz podkatalog stare z plikiem c.txt.
Zadania (dla uczniów)
Zadanie 1 (3 pkt). Policz wiersze ze słowem ERROR na dwa sposoby (grep -c oraz grep | wc -l) i policz wiersze ze słowem timeout.
Zadanie 2 (4 pkt). Podaj użytkownika z największą liczbą zdarzeń i tę liczbę (potok z awk, sort, uniq -c, head); wypisz w jednym wierszu unikalnych użytkowników z błędami; wypisz drugi wiersz pliku.
Zadanie 3 (3 pkt). Policz pliki .txt w raporty (także w podkatalogach), wypisz katalogi, skopiuj dziennik do raporty, sprawdź zgodność kopii poleceniem cmp, przenieś notatki.md do stare i wypisz zawartość stare.
Punktacja
Każde polecenie z poprawnym wynikiem — wartość podana w nawiasie rozłożona równo na polecenia danego zadania; uznajemy równoważne polecenia (np. wc -l < plik). Brak cudzysłowu we wzorcu przy find — minus 0,5 pkt.
Uwagi dotyczące wyników
W zadaniu 2 najwięcej zdarzeń ma jan (cztery wobec trzech zdarzeń oli), więc nie ma remisu; przy zmianie danych warto sprawdzić, czy nie powstaje remis, bo wynik zależy wtedy od kolejności sortowania.
Zadania
Zadanie 1. Policz wiersze z ERROR na dwa sposoby oraz wiersze z timeout.
Zadanie 2. Znajdź użytkownika z największą liczbą zdarzeń, wypisz unikalnych użytkowników z błędami i drugi wiersz pliku.
Zadanie 3. Policz pliki .txt, wypisz katalogi, skopiuj dziennik, porównaj kopię, przenieś notatki.md i wypisz zawartość stare.
Dla chętnych: wypisz godziny wszystkich zdarzeń ERROR jednym poleceniem (potok grep i awk).
Rozwiązanie i wyniki
set -e
TMP=$(mktemp -d)
cd "$TMP"
cat > dziennik.txt <<'DANE'
08:01 ola LOGIN
08:05 jan LOGIN
08:07 ola ERROR timeout
08:12 kasia LOGIN
08:15 jan ERROR disk
08:20 ola LOGOUT
08:31 jan ERROR timeout
08:40 jan LOGOUT
DANE
mkdir -p raporty/stare
touch raporty/a.txt raporty/b.txt raporty/stare/c.txt raporty/notatki.md
echo "--- Zadanie 1: grep i wc"
grep -c ERROR dziennik.txt
grep ERROR dziennik.txt | wc -l
grep -c timeout dziennik.txt
echo "--- Zadanie 2: potoki"
awk '{print $2}' dziennik.txt | sort | uniq -c | sort -rn | head -n 1 | awk '{print $2, $1}'
grep ERROR dziennik.txt | awk '{print $2}' | sort -u | tr '\n' ' '
echo
head -n 2 dziennik.txt | tail -n 1
echo "--- Zadanie 3: pliki"
find raporty -name "*.txt" | wc -l
find raporty -type d | sort
cp dziennik.txt raporty/dziennik_kopia.txt
cmp dziennik.txt raporty/dziennik_kopia.txt && echo "kopia identyczna"
mv raporty/notatki.md raporty/stare/
ls raporty/stare
cd /
rm -r "$TMP"
Skrypt rozwiazanie.sh z pakietu wykonuje te polecenia w katalogu tymczasowym i wypisuje:
--- Zadanie 1: grep i wc
3
3
2
--- Zadanie 2: potoki
jan 4
jan ola
08:05 jan LOGIN
--- Zadanie 3: pliki
3
raporty
raporty/stare
kopia identyczna
c.txt
notatki.md
Typowe błędy
| Objaw | Co sprawdzić |
|---|---|
Zły wynik grep -c | Wzorzec pasuje do większej liczby wierszy niż zakładano (np. wielkość liter); sprawdź grep -i. |
uniq -c bez sort | uniq łączy tylko sąsiednie, więc najpierw posortuj. |
| Różne wyniki przy remisie | Przy równych liczbach kolejność zależy od sort; sprawdź ustawienia lokalne. |
Wzorzec *.txt bez cudzysłowu w find | Powłoka rozwinie go przed uruchomieniem find. |
cmp nic nie wypisuje | To znaczy, że pliki są identyczne. |
mv do nieistniejącego katalogu | Najpierw utwórz katalog docelowy. |
Pytania kontrolne i punktacja
- Czym różnią się
grep -c ERROR plikigrep ERROR plik | wc -l? - Dlaczego przed
uniq -cwywołujemysort? - Co oznacza brak wyjścia z
cmp?
Odpowiedzi: Zwracają ten sam wynik: pierwsze liczy wiersze wewnątrz grep, drugie przekazuje je do wc. Bo uniq łączy tylko sąsiadujące identyczne wiersze. Że pliki są identyczne.
Proponowana punktacja (razem 10 punktów): zadanie 1 — 3 pkt; zadanie 2 — 4 pkt; zadanie 3 — 3 pkt (rozłożone równo na polecenia). Zadanie dla chętnych nie jest wymagane do pełnej oceny.
Materiały do pobrania
Rozpakuj ZIP przed otwarciem plików. Materiały są dostępne bez logowania; publiczne rozwiązanie służy nauce i samodzielnemu sprawdzeniu, a nie poufnemu sprawdzianowi.
Co dalej?
Następny krok to test z uprawnień i procesów oraz skrypty bash. Ten materiał rozwija dział o pracy w terminalu w kursie Linux w TablicaPro, gdzie znajdziesz prezentacje, ćwiczenia i testy do prowadzenia lekcji.
Źródła techniczne: podręcznik GNU grep oraz GNU coreutils. Zobacz też lekcję o przekierowaniach i potokach.
Poprowadź kolejne lekcje Linux
Pełny kurs: prezentacje, ćwiczenia i testy do pracy z klasą.
Kup dostęp do kursu Linux →