我是Unix的新手,目前正在上课,学习系统及其命令的基础知识。
我正在寻找一个命令行来从/ etc / passwd目录按字母顺序列出所有用户主目录。这仅适用于主目录,而不适用于其中的内容。应该没有重复的条目。我尝试了许多命令的排列,如下所示:
sort -d | find /etc/passwd /home/* -type -d | uniq | less
我尝试过使用-path,-name,删除-type,使用-prune,并将搜索模式更改为/ home / * / $之类的内容,但一次没有得到好的结果。我最多可以得到一个我自己的目录列表(包含其中的每个目录,这都是坏的),以及服务器上其他学生的目录(没有包含的目录,这很好)。我只是不能让它显示/ home / user目录,而不是我自己的帐户。
非常感谢提前。
答案 0 :(得分:3)
/etc/passwd
是一个文件。主目录通常位于字段/列6,其中“:”是分隔符。当您处理具有不同字符作为分隔符的文件结构时,您应该使用一种工具,可以将数据分解为更小的块,以便使用字段和字段分隔符更轻松地进行操作。 awk / cut等,即使使用带有IFS变量集的shell也可以完成这项工作。例如
awk -F":" '{print $6}' /etc/passwd | sort
cut -d":" -f6 /etc/passwd |sort
使用shell读取文件
while IFS=":" read -r a b c d e home_dir g
do
echo $home_dir
done < /etc/passwd | sort
答案 1 :(得分:1)
我认为你想要的工具是grep,tr和awk。 Grep将为您提供实际包含主目录的文件中的行。 tr
将允许您将分隔符拆分为空格,这使得每行更容易解析。
Awk只是一个可以帮助您显示所需结果的程序。
祝你好运:)另一个提示,请尝试ls --color=auto /etc
,passwd
不是您认为的那种文件。目录以蓝色显示。
答案 2 :(得分:0)
在Unix中,find
是用于在一个或多个目录下查找文件的命令。我想你正在寻找一个命令来查找文件中与模式匹配的行?查看命令grep
。
答案 3 :(得分:0)
sed 's|\(.[^:]*\):\(.[^:]*\):\(.*\):\(.[^:]*\):\(.[^:]*\)|\4|' /etc/passwd|sort
答案 4 :(得分:0)
我认为可以避免所有这些处理。有一个列出目录内容的实用程序。
ls -1 /home
如果您希望排序顺序颠倒
ls -1r /home
当然,这列出了该目录名称的名称,但不包括'/ home /',但如果需要,可以很容易地添加回来
ls -1 /home | (while read line; do echo "/home/"$line; done)
答案 5 :(得分:0)
我使用了类似的东西:
ls -l -d $(cut -d':' -f6 /etc/passwd) 2>/dev/null | sort -u
我唯一没做的就是按字母顺序排序,还没有想到呢