Многоадресный NTP-сервер / клиент

#!/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 заменит : между двумя полями на пробел.

1
26.08.2019, 12:16
0 ответов

Теги

Похожие вопросы