poniedziałek,
Zadania: data i czas, sortowanie, filtrowanie
Zadania wraz z odpowiedziami dotyczą dostępnych w Linuksie komend date, sort oraz grep. Zwróć uwagę, że podręczniki systemowe, o których mowa w komentarzu, są dostępne w systemie także na egzaminie potwierdzającym kwalifikacje zawodowe. Osoby, które ogólnie znają działanie danej komendy, są w stanie bardzo szybko odszukać odpowiednie opcje, a w niektórych wypadkach nawet przykłady ich stosowania.
Data i czas
Napisz komendę, która wyświetli:
- jutrzejszą datę;
- wczorajszą datę;
- datę, która wypadnie za rok;
- datę, która wypadnie za miesiąc;
- datę za cztery tygodnie w formacie ddXmmXYYYY (np. 02X11X2020);
- nazwę dnia tygodnia, w którym rozpoczął się rok szkolny (1 września 2020);
- nazwę dnia tygodnia, w którym zakończą się zajęcia w bieżącym roku szkolnym (25 czerwca 2021)
- nazwę dnia tygodnia, w którym rozpoczęła się druga wojna światowa (1 września 1939);
- kalendarz dla grudnia bieżącego roku;
- kalendarz dla 2021 roku;
Zadania 1-4 są bardzo podobne. Informacje i przykłady potrzebne do ich wykonania można odszukać w dostępnym w systemie podręczniku w formacie Info (komenda info date), w rozdziale „Date input formats” » „Relative items in date strings”. W tym samym podręczniku w rozdziale „Examples of date” znajdziesz kilka dodatkowych przykładów. Komendę należy trochę przemyśleć, np. jeśli chodzi o rok stosowanie "+365 days" jest błędem (są też lata przestępne). Odpowiedzi do pytań 1–4 (w kilku wariantach):
date --date='+1 day'
date --date='next day'
date --date='tomorrow'
date --date='-1 day'
date --date='1 days ago'
date --date='1 day ago'
date --date='yesterday'
date --date='+1 year'
date --date='next year'
date --date='+1 month'
date --date='next month'
Formatowanie daty potrzebne do rozwiązania zadania nr 5 jest dobrze opisane w podręcznikach systemowych, zastosowany jako separator znak X jest nietypowy w datach i uniemożliwia bezmyślne przyklejanie odpowiedzi znalezionych w Internecie, jednak jest takim samym znakiem jak np. minus czy dwukropek i obowiązują go te same reguły. Reszta wymaganych wiadomości została przedstawiona przy poprzednich pytaniach. Dwa warianty odpowiedzi:
date --date='+28 days' +%dX%mX%Y
date --date='+4 weeks' +%dX%mX%Y
Zadania 6–8 są bardzo podobne. Wszystkie informacje potrzebne do ich wykonania zostały przedstawione we wskazówkach do poprzednich pytań, szczegóły znajdziesz w podręcznikach systemowych. Odpowiedzi na pytania 6–8:
date --date='2020-09-01' +%A
date --date='2021-06-25' +%A
date --date='1939-09-01' +%A
# nieoptymalnie jednak pokazuje kolejne możliwości
date --date='1939-09-03 -2 days' +%A
Ostatnie dwa pytania dotyczą programu cal. Wszystkie potrzebne opcje można uzyskać, zaglądając do pomocy systemowej, są one dość intuicyjne. Odpowiedzi na pytania 9–10:
cal 12 2020
cal 2020
Filtr grep
Napisz komendę, która wyświetli:
- pliki z katalogu /bin, w których nazwa kończy się ciągiem znaków zip;
- pliki z katalogu /bin, w których nazwa nie kończy się ciągiem znaków zip;
- liczbę plików z katalogu /bin, których nazwa rozpoczyna się literą l;
- liczbę plików z katalogu /bin, których nazwa kończy się literą s;
- liczbę plików z katalogu /bin, których nazwa kończy się literą p;
- liczbę plików z katalogu /bin, których nazwa kończy się literą e;
- liczbę plików z katalogu /bin, których nazwa kończy się ciągiem znaków zip;
- wiersze z informacją o nazwie procesora z pliku /proc/cpuinfo;
- wiersze z informacją o ilości rdzeni procesora z pliku /proc/cpuinfo;
- wiersze z informacją o częstotliwości taktowania procesora z pliku /proc/cpuinfo;
- wiersze z pliku /etc/passwd zawierające ciąg znaków root oraz trzy następujące po nim wiersze (ciąg root może się powtarzać w pliku, wtedy komenda wybierze nie cztery wiersze a 8, 12 itd.);
Filtr grep potrafi przeszukiwać na podstawie wzorca pliki lub standardowe wejście. Nie jest w stanie wyświetlić plików z katalogu, dlatego dwa pierwsze zadania wymagają zastosowania potoku, w którym wynik odpowiedniego polecenia trafia na wejście filtra grep. Standardowym narzędziem do wyświetlania plików jest program ls. We wzorcu należy zastosować wyrażenie regularne z metaznakiem oznaczającym koniec wiersza ($). Podstawowa składnia wyrażeń regularnych stosowanych w programie grep jest dobrze opisana w manualu systemowym (man grep). Drugie pytanie wymaga dołączenia jeszcze dodatkowego przełącznika odwracającego sens dopasowania. Informacja na ten temat także znajduje się w manualu. Odpowiedzi na pytania 1–2:
ls /bin | grep zip$
ls /bin | grep -v zip$
Pytania 3–7 są bardzo do siebie podobne. Metaznak oznaczający początek wiersza to ^, koniec wiersza został już omówiony wcześniej. Kluczowy element to opcja c, która wyłącza standardowe wyjście i wypisuje tylko liczbę dopasowanych wierszy. Wszystkie opcje programu grep znajdziesz w manualu systemowym. Odpowiedzi na pytania 3–7:
ls /bin | grep -c ^l
ls /bin | grep -c s$
ls /bin | grep -c p$
ls /bin | grep -c e$
ls /bin | grep -c zip$
Pytania 8–10 dotyczą tego samego pliku i wykorzystują ten sam mechanizm. W pliku /proc/cpuinfo przechowywane są informacje o zainstalowanych procesorach. W przypadku procesora wspierającego pracę wielowątkową, każdy wątek reprezentowany jest tak jak fizyczny procesor, np. układ obsługujący osiem wątków otrzyma w pliku /proc/cpuinfo osiem identycznych wpisów (różniących się tylko numerem procesora). Wpisy obejmują wiele wierszy zawierających opis właściwości procesora. Żeby odfiltrować wybraną własność, należy na początku przeanalizować zawartość pliku (cat /proc/cpuinfo). Na przykład nazwa modelu procesora znajduje się w wierszu rozpoczętym słowami model name. W tym momencie zadania 8–10 powinny stać się już proste, w pytaniach użyto słowa „wiersze”, więc mogą się one powtarzać i nie trzeba tym się przejmować. Odpowiedzi na pytania 8–10:
grep 'model name' /proc/cpuinfo
grep 'cpu cores' /proc/cpuinfo
grep 'cpu MHz' /proc/cpuinfo
Filtr grep potrafi uporać się z problemem duplikowania wierszy poprzednio omówionych zadań. Przełącznik m pozwala zatrzymać odczytywanie pliku po zadanej ilości dopasowań. Jeśli w pytaniach 8–10 miałby wyświetlić się tylko jeden wiersz, można zastosować komendę w stylu:
grep -m 1 'model name' /proc/cpuinfo
Nowością z pytania nr 11 jest konieczność wyświetlenia także kilku wierszy następujących po dopasowaniu. Jak łatwo się domyślić odpowiedni przełącznik można odszukać w dołączonej do programu pomocy. W pliku /etc/passwd fraza root może się powtarzać (np. wystąpi nazwa chroot), jednak pytanie pozwala zignorować taką możliwość. Odpowiedź na pytanie nr 11:
grep -A 3 root /etc/passwd
Możliwe jest zmodyfikowanie odpowiedzi na pytanie nr 11 w taki sposób, żeby obsłużyć tylko pierwsze wystąpienie poszukiwanej frazy.
grep -A 3 -m 1 root /etc/passwd
Sortowanie
Napisz komendę, która wyświetli:
- posortowany w odwrotnej kolejności plik /etc/mime.types;
- posortowany w odwrotnej kolejności plik /etc/hosts;
- odwrotnie posortowany plik /etc/passwd (z na początku, a na końcu);
- odwrotnie posortowany wynik komendy ls -1 /bin;
- plik /etc/passwd posortowany wg trzeciej kolumny;
- plik /etc/passwd posortowany numerycznie wg kolumny userID (numerycznie, czyli np. 2 przed 10);
Odwrotną kolejność sortowania wymusza opcja r. Odpowiedzi na pytania 1–3:
sort -r /etc/mime.types
sort -r /etc/hosts
sort -r /etc/passwd
Dzięki zastosowaniu potoku wynik komendy ls może być wejściem programu sort. Odwrotne sortowanie wymusza przedstawiona już opcja r. Odpowiedź na pytanie nr 4:
ls -1 /bin | sort -r
Zadanie nr 5 należy rozpocząć od wyświetlenia pliku /etc/passwd (cat /etc/passwd). Można wtedy zaobserwować, że w jego wierszach kolejne kolumny wyznaczone są przez znak dwukropka (:). Znak podziału można przekazać programowi sort za pomocą opcji t (zapis -t:). Parametr k oznacza numer kolumny, według której sortowane będą wiersze. Odpowiedź na pytanie nr 5:
sort -t: -k3 /etc/passwd
W zadaniu nr 6 początkowo należy ustalić, która kolumna zawiera userID. Taka informacja jest w odpowiednim manualu systemowym (man 5 passwd). Okazuje się, że jest to kolumna nr 3, podobnie jak w poprzednim zadaniu. Jedyna różnica to konieczność wymuszenia sortowania w sposób numeryczny (opcja n). Odpowiedź na pytanie nr 6:
sort -n -t: -k3 /etc/passwd