Подсказки по программам
grep
Отличная программа для отбора строк, но она очень плохо подходит для работы с текстовыми таблицами. Отбор строк, содержащих какое-то слово, в случае таблиц почти гарантированно приведет к ошибкам, потому что искомое слово обычно может встречаться не только в нужном столбце, но и в других. Программа grep не умеет искать паттерн только в нужном столбце. Поэтому безопасно использовать grep для отбора строк из таблицы можно только в двух случаях:
паттерн абсолютно точно может встречаться только в нужном столбце (такое бывает очень редко);
нужный столбец является крайним (первым или последним), тогда отобрать строки можно аккуратно, добавив нужный "якорь" (^ или $) к паттерну.
tr
Программа tr ничего не знает о структуре текста, она умеет только заменять (и удалять) все вхождения символа на другой символ. Можно заменять сразу несколько разных символов, но это не значит, что можно заменять конкретные слова! Если вы попытаетесь заменить все вхождения AB, то заменятся все A и все B.
Еще можно заменять управляющие символы (типа табулятора и переноса строки), какие обозначения понимает tr описано в мануале.
uniq
А у uniq есть одна важная особенность, из-за которой эту программу можно использовать почти исключительно в связке с sort. Про это тоже можно прочитать в man uniq – последний абзац раздела DESCRIPTION, начинающийся с Note: ...
sort
При числовой сортировке с помощью sort все строки, не являющиеся числами, считаются эквивалентными нулю.
bash
У bash есть неинтерактивный режим работы, в котором он исполняет команды, прочитанные из текстового файла. Такие файлы с набором команд называют сценариями (или, в разговорном стиле, скриптами). Чтобы запустить сценарий на исполнение, нужно передать его команде bash в качестве аргумента.
$ bash ~/term1/credits/pr5.sh
В результате запустится новый процесс bash, который будет считывать строчки из файла и интерпретировать их в качестве команд. Поэтому в файле не должно быть постороннего текста! Допускаются только пустые строки для визуального разделения команд.
Крайне важно, чтобы сценарий имел разделители строк в формате Unix!
На самом деле нет никаких умолчательных значений для стандартных потоков ввода/вывода программ. Все программы, которые запускает bash, наследуют его стандартные потоки ввода/вывода, если в команде не были указаны никакие перенаправления. При запуске bash в интерактивном режиме его стандартные потоки подключаются к терминалу, чтобы пользователь мог вводить команды и видеть сообщения bash. Поэтому и программы "по умолчанию" запускаются с потоками, подключенными к терминалу. Но если при вызове bash перенаправить его стандартные потоки ввода/вывода, то именно перенаправленные потоки станут "значением по умолчанию" для всех выполняемых команд. Это позволяет перенаправлять ввод/вывод сразу всех команд сценария, если они используют стандартные потоки.
$ cat script.sh
echo 1
echo 2
$ bash script.sh
1
2
$ bash script.sh > out.txt
$ cat out.txt
1
2
Можно перенаправить потоки и при запуске bash в интерактивном режиме, но вы получите довольно чудное поведение, которое вряд ли может иметь смысл.
Попробовать что-то вроде bash > bash.out или bash -i 2> bash.err не запрещено, только не запутайтесь во вложенных сессиях. Если приглашение командной строки не поменялось, то это не значит, что вы общаетесь все с тем же процессом bash. Про опцию -i можно почитать в man bash.

2024
2023
2022
2021
2020
2019
2018
2017