我有一个 /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.conf
LDAP 等指定的多个位置中。
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