处理 /etc/passwd 文件以列出主文件夹在 /home 中的所有用户

era*_*ans 10 awk text-processing wildcards passwd

我有一个像这样的示例 /etc/passwd 文件:

tom:x:1000:1000:Work:/home/tom:/bin/bash
george:x:1000:1000:Work:/home/george:/bin/bash
bla:x:1000:1000:Work:/home/bla:/bin/bash
boo:x:1000:1000:Work:/home/boo:/bin/bash
bee:x:1000:1000:Work:/root/list:/bin/bash
Run Code Online (Sandbox Code Playgroud)

我正在尝试列出所有用户在/home/.

我写

cat ~/Desktop/e.txt |awk -F ":" '{if ($6 ~/^/home/) print $1;}'
Run Code Online (Sandbox Code Playgroud)

其中 e.txt 是我在这里复制的文本。

我知道作为转义字符的反斜杠存在问题,但是如何修复它以便我可以在命令的一行中列出它们?

mur*_*uru 12

您可以使用引号代替/正则表达式,以避免转义/:

awk -F: '$6 ~ "^/home/" {print $1}' ~/Desktop/e.txt
Run Code Online (Sandbox Code Playgroud)

用awk,{if (foo) ... }通常可以简化为foo {...}。


Rom*_*est 11

您可以转义正斜杠,如下所示:

awk -F':' '$6~/^\/home\//{ print $1 }' ~/Desktop/e.txt
Run Code Online (Sandbox Code Playgroud)

另一个技巧是使用复杂的字段分隔符:

awk -F'[:/]' '$7=="home"{ print $1 }' ~/Desktop/e.txt
Run Code Online (Sandbox Code Playgroud)
  • -F'[:/]'- 将:和/都视为字段分隔符

  • 我相信评论字段(就在主目录之前)允许包含斜杠。 (2认同)

Den*_*son 8

假设e.txt实际上是/etc/passwd,您应该实际使用getent passwd而不是解析文件,因为用户帐户信息可能存储在/etc/nsswitch.confLDAP 等指定的多个位置。

getent passwd | awk -F ':' '$6 ~ "^/home"'
Run Code Online (Sandbox Code Playgroud)

请注意,print当条件为真时,该语句是隐含的。不过,这将打印整行。这将只打印用户名:

getent passwd | awk -F ':' '$6 ~ "^/home" {print $1}'
Run Code Online (Sandbox Code Playgroud)