*nix command-line utilities

advertisement
*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
Download