*nix command-line, command-line utilities redirection, piping, exit code grep, find, du Арыков Никита, nikita.arykov@gmail.com Standard streams(Стандартные потоки) • stdin/stdout/stderr – имеют тип FILE*, определены в <stdio.h> • Стандартный workflow программа читает из stdin, и пишет в stdout или stderr Standard streams(Стандартные потоки) • Обычно(не обязательно), эти дескрипторы открыты уже в момент запуска исполняемого файла(поэтому с целью экономии дескрипторов их можно сразу закрыть fclose(stdin)). • Посмотреть открытые дескрипторы у процесса cat /proc/$PROC_PID/fd, где $PROC_PID – pid процесса. Redirecting(Перенаправление) • Перенаправление - это возможность позволяющая перенаправлять стандартные потоки в определенное пользователем место, например в файл. • выполняет command, помещая стандартный вывод в file, при этом предыдущее содержимое файла затирается: command > file Redirecting(Перенаправление) • выполняет command, помещая стандартный вывод в file, дописывает в конец файла: command >> file • Выводит stderr(дескриптор 2) в file: command 2> file • выполняет command, используя в качестве источника ввода file (вместо клавиатуры): command < file Piping(Конвейер) • Конвейеры — возможность нескольких программ работать совместно, когда выход одной программы непосредственно идет на вход другой без использования промежуточных временных файлов. Синтаксис: command1 | command2 • Цепочка конвейеров: command1 | command2 | command3 Piping(Конвейер) • Выполняет command1 используя её поток вывода, как поток ввода при выполнении command2(command1 | command2), что равносильно использованию двух перенаправлений и временного файла: command1 > temporaryFile command2 < temporaryFile rm temporaryFile Exit code(Exit status)(Код возврата) • Код завершения программы, если .cpp фаил содержит любую из строчек return nnn; exit(nnn); return(nnn); • То nnn и есть код возврата. Изменяется от 0 до 255. Обычно считается, что при успешном завершение программы код возврата должен быть 0. Exit code(Exit status)(Код возврата) • Для того, чтобы посмотреть exit code последний отработавшей программы, нужно набрать echo $? • Пусть дан фаил main.c: int main() {return -1;} • $ gcc main.c • $ ./a.out • $ echo $? • Что будет выведено? grep(1) • grep — утилита командной строки, которая находит на вводе строки, отвечающие заданному регулярному выражению, и выводит их, если вывод не отменён специальным ключом. Название представляет собой акроним английской фразы «search globally for lines matching the regular expression, and print them» — «искать везде строки, соответствующие регулярному выражению, и выводить их». • SYNOPSIS: grep [OPTIONS] PATTERN [FILE...] grep(1) • Поиск всех строк в которых встречается слово stdin в файле stdio.h и вывод этих строк с их номерами: grep -n stdin stdio.h • --color добавляет подсветку(рекомендуется дописать в ~/.bashrc: alias grep=‘grep --color’ • Поиск всех строк в которые входят stdin рекурсивно из текущей директории grep stdin –r ./ grep(1) • Флаги: • -i регистронезависемый поиск • -с выводит количество найденных строк(без самих строк). • -l выводит только имена файлов • -r рекурсивный поиск • -х для точного соответствия шаблона и строки. • -rl годная комбинация grep(1) • Поиск по RegExp . - соответствует любому единичному символу. * - соответствует одному или нескольким единичным символам, которые предшествуют звездочке. ^ - соответствует регулярному выражению в начале строки. $ - соответствует регулярному выражению в конце строки. • Пример: grep -rl '.*0111.' ./ Chained pipelines • Эквивалентом для grep –c stdin stdio.h будет grep stdin stdio.h | wc – l, где wc –l подсчитывает количество строк. • Очень удобно искать по именам файлов в текущей директории: ls | grep main • Как сделать поиск по symlink? find(1) • find — утилита поиска файлов, используемая в UNIX‐подобных операционных системах. Ищет рекурсивно. • SYNOPSIS: find [-H] [-L] [-P] [-D debugopts] [Olevel] [path...] [expression] find(1) • Поиск в текущей директории рекурсивно: find . -name '*io*‘. Возможна не отсортированость результатов! Использовать find . -name '*io*‘ | sort • Поиск в нескольких директориях: find /usr/local/man /opt/local/man -name 'my*‘ • Подсветки нету =( find(1) • Поиск файлов определенного типа: find . name "my*" -type f, где типом может быть f=regular file, d=directory, l=symlink, etc.(see man find). • Есть разные критерии поиска: по времени, по правам доступа, по размеру, etc. find(1) • Например, найдем файлы, которые не читали более чем (условие «более чем» задается знаком «+») 30 дней: find . -atime +30 –print • Критерий поиска время: • -atime N - Последний раз к файлу обращались N дней назад. • -mtime N - Последнее изменение файла было N дней назад. du(1) • du – disk usage, стандартная Unix программа для оценки занимаемого файлового пространства. • Подсчитать итоговый размер заданной директории в байтах: du -s /bin • Подсчитать итоговый размер занимаемый текущей директорией и вывести в удобной для человека форме: du -sh