У меня есть файл, в котором по одной записи в строке. Каждая строка имеет следующий формат:
"group:permissions:users"
Разрешения и пользователи могут иметь несколько значений, разделенных запятыми, например:
"grp1:create,delete:yo,el,ella"
Я хочу вернуть следующее:
yo
el
ella
Вот что у меня есть на данный момент:
cat file | grep grp1 -w | cut -f3 -d: | cut -d "," -f 2
Это возвращает yo,el.ella, как я могу заставить его возвращать одно значение в строке?





Вы можете использовать awk с параметром -F для использования: в качестве разделителя полей:
[user@host]$ echo "grp1:create,delete:yo,el,ella" | awk -F ':' '{print $3}'
yo,el,ella
Это даст вам только строку пользователей, разделенную запятыми. Затем вы можете делать с этой строкой все, что захотите. Если вы хотите буквально печатать каждого пользователя по одному в строке, вы можете использовать tr для замены запятых на новые строки:
[user@host]$ echo "grp1:create,delete:yo,el,ella" | awk -F ':' '{print $3}' | tr ',' '\n'
yo
el
ella
Вот один из способов сделать это полностью в сценарии оболочки. Вам просто нужно изменить IFS, чтобы он разбивал «слова» на нужные символы. Примечание. Это не обрабатывает экранирование (например, ":" в некоторых форматах файлов).
Это написано, чтобы вы могли:
cat file | name-of-script
Сценарий:
#!/bin/bash
while IFS=: read group permissions users; do
if [ "$group" = "grp1" ]; then
IFS=,
set -- $users
while [ $# -ne 0 ]; do
echo $1
shift
done
fi
done
конечно ... это, вероятно, выполнимо с только awk, но мой awk-fu сильно ограничен;)