0

我想从 /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

我想使用脚本从这个文件中获取用户。首先读取来宾和 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

我想先提取 'guest' 对其进行一些操作,然后提取 '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,并且文件系统是自定义构建的。

4

3 回答 3

1

您可以使用以下 GNU sed 命令:

sed '0,/#guest/d;/#gend/,$d;s/:.*//' /etc/passwd

0,/#guest/d删除所有行,直到#guest(包括它)。

/#gend/,$d删除#gend使用 a 表示的从输入到结尾的所有内容$。(在 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
于 2016-06-08T12:05:37.587 回答
0

您需要指定:为记录分隔符并利用记录变量。让我们打印一条简单的消息:

 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
于 2016-06-08T10:16:31.997 回答
0

只需在输出周围放置一个循环:

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
于 2016-06-08T12:37:45.070 回答