Как получить символы перед запятой в списке и экспортировать в скрипт? [дубликат]

На этот вопрос уже есть ответ:

У меня есть файл, содержащий список пользователей и информация, каждая строка - это отдельный пользователь, записанный так:

alfred,butler,male,70,7:15. 

Я хочу получить имена только из списка, чтобы я мог создать для них пользователя.

Когда у меня есть имена, я могу просто использовать цикл for и выводить useradd с каждым из имен пользователей, а затем просто скопировать и вставить текст. Как подойти к захвату символов перед первой запятой?

2
задан 5 February 2017 в 22:42

2 ответа

Извлечение имен легко: используйте 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 в команде, которую Вы передаете

1
ответ дан 2 December 2019 в 02:48

Вы могли использовать 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> на аргументе, расширенном от переменной (т.е. на каждой строке переданного по каналу вывода)
2
ответ дан 2 December 2019 в 02:48

Другие вопросы по тегам:

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