На этот вопрос уже есть ответ:
У меня есть файл, содержащий список пользователей и информация, каждая строка - это отдельный пользователь, записанный так:
alfred,butler,male,70,7:15.
Я хочу получить имена только из списка, чтобы я мог создать для них пользователя.
Когда у меня есть имена, я могу просто использовать цикл for и выводить useradd с каждым из имен пользователей, а затем просто скопировать и вставить текст. Как подойти к захвату символов перед первой запятой?
Извлечение имен легко: используйте awk с -F
отметьте для печати первого поля
awk -F, '{print $1}' input.csv
Для фактического добавления пользователей необходимо считать вывод awk, линию за линией. Один способ сделать так состоит в том, как Zanna показывает с каналом к while read variable ; do . . . done
.
Альтернатива должна была бы использовать в своих интересах awk's system()
функция, чтобы создать команду сначала и передать его функции. Рассмотрите это:
$ awk -F ',' '{command=sprintf("useradd \"%s\"",$1);print command }' input.txt
useradd "alfred"
useradd "johnny"
Для каждой строки мы извлекаем первое слово и помещаем его в useradd "%s"
. Этому можно дать system()
функционируйте и это будет работать с /bin/sh
Выполнение этого как корень:
$ awk -F ',' '{command=sprintf("useradd \"%s\" ",$1); system(command) }' input.txt
$ grep 'alfred' /etc/passwd
alfred:x:1001:1001::/home/alfred:
Внимание: system()
вызовы /bin/sh
, который на Ubuntu является символьной ссылкой на /bin/dash
. Поэтому избегайте bashisms в команде, которую Вы передаете
Вы могли использовать cut
, чтобы захватить первое поле и затем передать по каналу в while
цикл к командам выполнения с именами, как введено:
cut -d ',' -f1 file | while read line; do echo "$line"; done
, очевидно, этот сценарий не делает ничего полезного, как это - замена echo
с тем, что Вы хотите сделать к каждому имени, например sudo useradd
(после тестирования с echo
)
-d ','
запятая использования как разделитель (d
) -f1
первое поле (f
) while read line
(1
), читающее из файла, цикла по каждой строке, поскольку переменная $line
do <command> "$line"
выполняется <command>
на аргументе, расширенном от переменной (т.е. на каждой строке переданного по каналу вывода)