Читать имя пользователя из измененного файла /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
Другие вопросы по тегам