#!/bin/sh
outfile="${1:-out}"
if [ -e "$outfile" ]; then
printf 'The filename "%s" already exists, refusing to overwrite\n' "$outfile" >&2
exit 1
fi
awk -F':' '/student/ { print $1, $NF }' /etc/passwd | LC_ALL=C sort -o "$outfile"
Этот сценарий использует awk
для анализа файла passwd
. Он пропускает все строки, кроме тех, которые содержат строку student
. Для этих строк будут выведены первое и последнее разделенные поля :
.
Вывод awk
передается в sort
, которая сортирует строки в лексикографическом порядке в стандартной локали POSIX и сохраняет результат в файле, имя которого указано в команде. линия.
Если имя файла не указано в командной строке, будет создан файл с именем out
. Если имя выходного файла уже существует, сценарий завершается с ошибкой.
$ chmod +x script
$ ./script output
В этом примере выходные данные находятся в файле с именем output
.
В качестве альтернативы команде awk
:
sed '/student/s/\([^:]*\):.*:\(.*\)$/\1 \2/' /etc/passwd | LC_ALL=C sort -o "$outfile"
Это делает то же самое, но путем применения подстановки к каждой строке, содержащей строку student
. При подстановке вся строка заменяется тем, что стоит перед первым :
, за которым следует пробел, а за ним следует то, что стоит после последнего :
.
Поскольку формат passwd
хорошо известен, мы знаем, что последний столбец - это столбец 7. Это означает, что мы можем обойтись простым grep
+ cut
+ tr
, в качестве другой альтернативы:
grep -F 'student' /etc/passwd | cut -d':' -f1,7 | tr ':' ' ' | LC_ALL=C sort -o "$outfile"
grep
находит все строки в интересующем нас файле. cut
дает нам первую и последние поля. tr
заменит :
между двумя полями на пробел.