K57

ЭКСКУРСИЯ В "БОТАНИЧЕСКИЙ САД"*0 
--------------------------------

*0) проводится ботаном

..если и дальше топать тропой Тейлора, то после sed логически следует awk. Awk множество раз переписывали и усложняли: mawk, nawk, gawk. Потом придумали Perl, который уж очень заумный, но зато умеет все, что раньше писали на tr, sed, awk. Я его так и использую, в благодарность за причесанные регулярные выражения, поддержку юникода и то, что их всех объединяет: лаконичность (код получается невероятно коротким в сравнении с линейкой языков эпохи Windows). 

Оригинальный tr не поддерживает юникод, есть версии от команд разработчиков Heirloom (2015), FreeBSD (v.10+) и план юнификации CoreUtils в Linux (2099+?, весь план точно выражен диалоге пилота космоплана с межгалактической проституткой:

  - I supported unification.
  - Did ya?
  - Well, I don't suppose you're the only whore that did.

  Firefly, 2012, s01e08, 00:28:40

Да, так вот, за счет чего код столь короткий? Это как учить чужой язык. Последовательность 0, 1 -> буквы -> слова -> фразы -> .. "на смерть поэта"*1 абсолютно нерабочая. Потыркавшись с этим лет 100, начали тренировать нейронные сети (как мозга, так и машинный интеллект) с помощью паттернов (целые фрагменты речи или кода, перевод шаблон крайне неудачен из-за засевшего в ушах штампа -- шаблонное мышление -- т.е. плоско, тупо, бездарно).
------
*1) Лермонтов, сочинил абсолютно гениально, на мой взгляд.

Писать паттернами сложнее, ключевое слово тут, это "тренировка", смотреть здесь:

  https://www.youtube.com/watch?v=z410eauCnHc
  https://github.com/Zulko/pianoputer  Python

А еще есть хорошая игрушка на тему "думать паттернами" 

Оригинал игры 1989 года для операционной системы DOS имел набор "паттернов" "out of control", собственно, ради которого я её и вспомнил.

  https://www.dosbox.com/
  https://www.myabandonware.com/game/blockout-ly#download.
  
Еще есть javascript клон, необходимый уровень (extended) выбирается combo-боксом (BlockSet: Basic, FlatFun, Extended):

  https://www.youtube.com/watch?v=Wo2b4--pI60
  https://github.com/yongchaofan/jsBlockout

  git clone https://github.com/yongchaofan/jsBlockout
  
играть в браузере (щелкнуть по стакану, чтобы игра началась..), 

Да, так вот, Awk я полюбил не только за краткость решения задачки, но и за краткость учебника (35 стр., попытался перевести для вас на русский с помощью yandex/google -- получилась такая гадость, что никакими руками не поправишь). И то ли из лени писать tutorial c нуля, то ли из нежелания тащить вас в прошлое, которого, как известно, не вернешь, решил так: кому интересно -- читайте оригинал*5, кому нет -- вместе учим powershell, rust,.. microsoft smallbasic:)*2 -- от модных трендов я моложе не стану, но вот виртуально.. начитался тут, как 90 летняя старуха в Second Life тинкой (teenager, малолетка) прикидывалась и всех с успехом "кидала" лет 5..*3
------
*2) https://lenta.ru/news/2020/04/30/covid_conspiracy/

*3) https://secondlife.fandom.com/wiki/Main_Page


# Очень важные "паттерны"
-------------------------

  0. Понятие текстового файла. Строка в смысле line (от ^ до $) а не string. Многострочная строка*4 (о великий и могучий).. multiline string
  
  1. Поля в смысле части строки между пробелами
  
      \s как [ \t] , а не [ \t\r\n\f] 
        {"space", "tab", "carriage return", "new line", "form feed"}
      
  2. Схема обработки текстового файла --
  
      BEGIN {} 
      {} # LOOP
      END {}
      
  3. Очень глобальные постоянные (данные, получаемые извне скрипта)
       ARGC ARGV FILENAME NR FNR NF $0 $1..$9
      
  4. Переключения. а) Очень временные (только здесь и сейчас), 
     привожу пример на языке sh, тоже ну очень полезный "паттерн":
  
       while read -r line; do echo "$line"; done < file.txt
       
     и б) временные (пока выполняется скрипт, или до явной отмены. В тексте оригинала*5 их пять: FS OFS RS ORS OFMT) 
     
       FS='\n' ARGC ARGV FILENAME NR FNR NF 
       
     Поколение Rust'а выбирает "очень временные", потому что легко забыть, что что-то изменялось и потому что нужно писать стек (увы, руками, или уж взять сразу Perl*8):
     
        push($FS,@stack); FS='\n';
        ..
        $FS=pop(@stack) *6 *7.
        
------
*4) Владимир Маслов. Введение в Perl.

  http://lib.ru/PERL/russperl5/perl.txt

*5) Awk -- A Pattern Scanning and Processing Language Programmer's Manual. Alfred V. Aho. Brian W. Kernighan. Peter J. Weinberger. September 30, 2015

  http://doc.cat-v.org/unix/v8/awktut.pdf
        
*6) Stacks are wonderful..

  http://www.troubleshooters.com/codecorn/awk/index.htm
      
*7) Perl | Arrays (push, pop, shift, unshift)

  https://www.geeksforgeeks.org/perl-arrays-push-pop-shift-unshift/

*8) Пример
```
  $ echo -e '\n' | perl -ne '
  BEGIN { push(@a,123); } 
  END { print pop(@a), "\n";}'
```
  123

Еще пример
```
  $ echo -e 'one\ntwo\nthree' | \
    perl -pe 'BEGIN {print "v\n";} {;} END {print "^\n";}'
```
либо
```
  $ echo -e 'one\ntwo\nthree' | \
    perl -ne 'BEGIN {print "v\n";} {print;} END {print "^\n";}'
```
  v
  one
  two
  three
  ^


# Идиомы, Парадигмы, Мировой Эфир и Искривление Пространства
------------------------------------------------------------

Самые сложные "паттерны" или шаблоны мышления (здесь перевод "шаблон" срабатывает как надо) называются парадигмами. Они такие большие, что ради них пишут или хотя бы изучают новые языки. Из "этих" надо уметь пользоваться этим (а иначе что?):

  позиционные и именованные параметры.
  умолчания (значения аргументов (avar=0), имена переменных ($_))
  '' "" `` (строка как есть, подставить значения, вычислить*9*10)
  сигнатуры, перегрузка функций и операторов.
  жадность или лень (greedy or lazy modificators, lazy evaluation)
  макросы и инлайн-функции
  замыкания (closures) и лямбда функции
  namespace (все понятия действуют только внутри контекста)
  скалярный и списковый контент (perl)
  чтение либо запись переменной (X=$V но VAR=1, *sh языки: sh, bash..)
  типы данных (скаляр, массив/очередь/стек, кортеж, список, хеш, дерево)
  обработка ошибок возвратом функции
  обработка ошибок блоком "on error"
  обработка ошибок исключениями (try catch throw)
  объектно ориентированное программирование 
    (класс и объект, наследование инкапсуляция полиморфизм)
  аспекты и обобщенное программирование (stl, generics)
  умные указатели, ссылки, сборка мусора
  RAII (Resource acquisition is initialization)
  видимость, время жизни, владение, заимствование и типажи*11 (traits)

то есть, настоящий рай для ботаника.
------
*9) expr is archaic. use $(( ))

  https://unix.stackexchange.com/questions/286209/using-expr

*10) "Сначала строка интерполируется, а потом выполняется как системная команда." -- Вы думаете здесь речь идет об интерполяции? Вовсе нет, но в пределах книги*4 значение этого слова не меняется т.е.: если в строке встречается задание на прочтение значений переменных ($var), то это делается. Пример на sh:

  $ DDD="date"
  $ echo `$DDD`
  Sun May 3 12:48:22 EEST 2020
  
*11) Типажи (трейты)

  https://doc.rust-lang.ru/stable/rust-by-example/trait.html


# Exercises (Alpine)
--------------------

Your reply should contain:

   script source in UTF8 text format
   script output in UTF8 text format

1. Using /etc/password, show users who use real shell to login (ash, sh, bash, csh, ksh, zsh..)

command:

  # script1
  
output:

  root      /bin/ash
  opilane   /bin/bash
  
2. Using /etc/group, show users who belong to more than one group.

command:

  # script2
  
output:

  root     adm,bin,daemon,root,sys,..
  ..
  opilane  abuild,opilane

3. Using /etc/shadow, show users who must login with password

command:

  # script3
  
output:

  root
  opilane

4. Using /etc/shadow, explain (decrypt) record for apache user

command:

  $ script4 apache
  apache:!:18380:0:99999:7:::
  
output:

  Username : ???
  Password : ??? 
  Lastchanged : ??? 
  Minimum : ???
  Maximum : ???
  Warn : ???
  Inactive : ???
  Expire : ???