Читать имя пользователя из измененного файла /etc/passwd с помощью скрипта
Я хочу прочитать пользователей из файла /etc/passwd. Мой файл /etc/passwd
/etc/passwd
root:eRYFFjZ2./oo:0:0:root:/:/bin/bash
nobody:*:99:99:Nobody:/:
ftp:*:14:50:FTP User:/:/bin/false
#guest
guest:/QP8Q2QieMWi4:500:500:Guest:/:/bin/bash
gst1:x:1002:1003:,,,:/home/gst1:/bin/bash
#gend
#admin
ad1:x:1003:1004:,,,:/home/adm1:/bin/bash
ad2:x:1004:1005:,,,:/home/adm2:/bin/bash
#adend
Я хочу получить пользователей из этого файла, используя script.first read guest и gst1 . Затем ad1,ad2. я пытался использовать
awk'#guest/{flag-1;next}/#gend/{flag=0}flag' /etc/passwd
awk'#admin/{flag-1;next}/#adend/{flag=0}flag' /etc/passwd
это дает мне две строки
guest:/QP8Q2QieMWi4:500:500:Guest:/:/bin/bash
gst1:x:1002:1003:,,,:/home/gst1:/bin/bash
ad1:x:1003:1004:,,,:/home/adm1:/bin/bash
ad2:x:1004:1005:,,,:/home/adm2:/bin/bash
Я хочу извлечь сначала гостя, сделать с ним какую-то операцию, а затем извлечь gst1 . Затем я хочу извлечь имена пользователей-администраторов (ad1 и ad2)
Можно ли извлечь их один за другим в цикле while. Я хочу вот так
start from label #guest
get user 'guest'
===do some work with 'guest'===
continue above steps for the users up to label #gend
Я запускаю этот Linux во встроенной цели, а файловые системы создаются на заказ.
3 ответа
Вы можете использовать следующую команду GNU sed:
sed '0,/#guest/d;/#gend/,$d;s/:.*//' /etc/passwd
0,/#guest/d
удаляет все строки до #guest
(включая это).
/#gend/,$d
удаляет все из #gend
до конца ввода, который выражается с помощью $
, (в GNU sed)
s/:.*//
удаляет все с первого раза :
до конца строки для оставшихся строк.
Выход:
guest
gst1
Если хотите "что-то сделать" с именами пользователей, используйте while
петля вместе с read
:
sed '0,/#guest/d;/#gend/,$d;s/:.*//' /etc/passwd | while read user ; do
echo "$user"
do something ...
done
Вам необходимо указать :
в качестве разделителя записей и использовать переменные записи. Напечатаем простое сообщение:
awk -F: '/#guest/{flag=1;next} /#gend/ {flag=0} flag { print "work with \"" $1 "\""}' /etc/passwd
Но вы также можете запустить внешнюю команду, указав имя пользователя в качестве параметра, изменив print
заявление к system
вызов.
Например. давайте перечислим содержимое домашнего каталога пользователя (используя содержимое шестого столбца /etc/passwd
):
awk -F: '/#guest/{flag=1;next} /#gend/{flag=0} flag { system("ls " $6) }' /etc/passwd
Просто поместите цикл вокруг вывода:
awk'#guest/{flag-1;next}/#gend/{flag=0}flag' /etc/passwd | while read pwline
do
# do what you want to do with guest users
done
awk'#admin/{flag-1;next}/#adend/{flag=0}flag' /etc/passwd | while read pwline
do
# do what you want to do with admin users
done