Unix [домашнее задание]: получить список каталогов /home/user/ в /etc/passwd
Я очень новичок в Unix, и в настоящее время беру класс, изучающий основы системы и ее команд.
Я ищу единственную командную строку для вывода списка всех домашних каталогов пользователей в алфавитном порядке из каталога /etc/passwd. Это относится только к домашним каталогам, а не к их содержимому. Там не должно быть повторяющихся записей. Я пробовал много перестановок команд, таких как следующие:
sort -d | find /etc/passwd /home/* -type -d | uniq | less
Я пытался использовать -path, -name, удалить -type, использовать -prune и изменить шаблон поиска на такие вещи, как /home/*/$, но ни разу не получил хороших результатов. В лучшем случае я могу получить список моего собственного каталога (вместе с каждым каталогом внутри него, что плохо) и каталогов других студентов на сервере (без содержащихся в нем каталогов, что хорошо). Я просто не могу заставить его отображать каталоги /home/user и ничего больше для моей учетной записи.
Спасибо заранее.
6 ответов
/etc/passwd
это файл домашний каталог обычно находится в поле / столбце 6, где ":" - разделитель. Когда вы имеете дело с файловой структурой, в которой в качестве разделителей используются различные символы, вы должны использовать инструмент, который может разбить ваши данные на более мелкие куски для более удобной работы с полями и разделителями полей. awk/cut и т. д., даже использование оболочки с набором переменных IFS может сделать эту работу. например
awk -F":" '{print $6}' /etc/passwd | sort
cut -d":" -f6 /etc/passwd |sort
использование оболочки для чтения файла
while IFS=":" read -r a b c d e home_dir g
do
echo $home_dir
done < /etc/passwd | sort
Я думаю, что вам нужны инструменты grep, tr и awk. Grep даст вам строки из файла, которые на самом деле содержат домашние каталоги. tr
позволит вам разбить разделитель на пробелы, что облегчает анализ каждой строки.
Awk - это всего лишь одна программа, которая поможет вам отобразить результаты, которые вы хотите.
Удачи:)
Еще один совет, попробуйте ls --color=auto /etc
, passwd
это не тот файл, который вы думаете. Каталоги отображаются синим цветом.
sed 's|\(.[^:]*\):\(.[^:]*\):\(.*\):\(.[^:]*\):\(.[^:]*\)|\4|' /etc/passwd|sort
Я использовал что-то вроде:
ls -l -d $(cut -d':' -f6 /etc/passwd) 2>/dev/null | sort -u
Единственное, чего я не делал, это сортировать по алфавиту, пока не понял
Я думаю, что всей этой обработки можно было бы избежать. Есть утилита для просмотра содержимого каталога.
ls -1 /home
Если вы хотите порядок сортировки в обратном порядке
ls -1r /home
Конечно, этот список содержит имя только этого имени каталога и не включает в себя "/ home /", но его можно добавить достаточно легко, если нужно, с помощью чего-то подобного
ls -1 /home | (while read line; do echo "/home/"$line; done)
В Unix find
это команда для поиска файлов в одном или нескольких каталогах. Я думаю, что вы ищете команду для поиска строк в файле, которые соответствуют шаблону? Посмотри в команду grep
,