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

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

我有一个 /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

我正在尝试列出具有主文件夹的所有用户/home/

我写

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

其中 e.txt 是我在此处复制的文本。

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

答案1

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

awk -F: '$6 ~ "^/home/" {print $1}' ~/Desktop/e.txt

有了awk{if (foo) ... }往往可以简化为 just foo {...}

答案2

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

awk -F':' '$6~/^\/home\//{ print $1 }' ~/Desktop/e.txt

其他诡计将使用复杂的字段分隔符:

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

答案3

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

getent passwd | awk -F ':' '$6 ~ "^/home"'

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

getent passwd | awk -F ':' '$6 ~ "^/home" {print $1}'

答案4

您还可以用于index固定字符串匹配,例如grep -F使用返回值来确保它与字符串的开头匹配

$ awk -F: 'index($6,"/home/")==1{print $1}' ip.txt
tom
george
bla
boo

或者如果需要正则表达式,请将其作为环境变量传递

$ r='^/home/' awk -F: '$6 ~ ENVIRON["r"]{print $1}' ip.txt
tom
george
bla
boo

相关内容