LINUX.ORG.RU

Как вывести список пользователей с определенными папками?


0

0

У меня на сервере есть пользователи с папками x и папками y. пример:

/home/user1/y/
/home/user2/y/
/home/user3/x/
/home/user4/x/
/home/user5/y/

Мне нужно составить список пользователей с папками Х и с папками Y.
Тоесть проверить всех пользователей на определенные папки и вывести список и количество пользователей с теми или иными папками.

Вывод пользователей делаю через эту переменную:

USERS=$(awk -F":" '$7 ~ /\/bin\/bash/ {print $1}' /etc/passwd)



for user in $( sed -n "s/^\([^:]*\):.*:\/bin\/bash$/\1/p" /etc/passwd ); do
    [ -d "/home/${user}/x" ] && echo "${user}"
done

Deleted
()
Ответ на: комментарий от Deleted

благодарю, помог.
ещё вопрос. как подсчитать количество выводимых папок?

скрипт:

[ $# -eq 0 ] && echo 'Parameter required.' && exit

echo 'Checking for cs installations.. Output users:'
sleep 1
echo ''

for user in $( sed -n "s/^\([^:]*\):.*:\/bin\/bash$/\1/p" /etc/passwd ); do
    [ -d "/home/${user}/$@" ] && echo "${user}"
done



al1as
() автор топика
Ответ на: комментарий от al1as

Извините что вторгаюсь, а как из текста /proc/partitions:

/dev/sda
/dev/sda1
/dev/sda2
/dev/sdb
/dev/sdb1
/dev/sdc
/dev/sdd
/dev/sdd1
/dev/sdd2
/dev/sdd3
/dev/sdd4
/dev/sdd5
...

с помощью bash и awk вывести все устройства (не партиции), кроме, например, sdb и sdc? То есть вывод должен содержать 'sda sdd sde'

blade
()
Ответ на: комментарий от blade

Ну что на это сказать?..
Учи регулярки и синтаксис awk/sed

Slader
()
Ответ на: комментарий от blade

> спасибо, но, извини, для меня это выглядит как набор символов ))))

Могу попробовать разжевать...

> sed -n "s/^\/dev\/\(sd[^bc]\)$/\1/p"


1.1. Опция -n запрещает sed'у автоматически выводить изменённые строки.
1.2. Конструкция s/aaa/bbb/ означает замену выражения aaa на выражение bbb в каждой строке ввода.
1.3. Дополнительная "опция" p (s/aaa/bbb/p) говорит sed'у всё-таки вывести изменённую строку, но только, если выражение aaa подошло к строке ввода. Комбинация sed -n "s/aaa/bbb/p" позволяет использовать sed ещё и вместо grep'а.

А теперь про выражение "^\/dev\/\(sd[^bc]\)$"
2.1. ^ - означает начало строки. Следующий за этим символ должен быть в строке ввода первым, иначе выражение не совпадёт со строкой ввода.
2.2. \/dev\/ - это строка "/dev/". Обратные слеши нужны, чтобы sed не перепутал прямые слеши с частью команды s/aaa/bbbb/.
2.3. \(aaa\) - это конструкция позволяет выделить часть строки ввода, чтобы потом что-нибудь с ней сделать.
2.4. sd - опять просто строка.
2.5. [^bc] - любой символ, кроме "b" и "c".
2.6. $ - конец строки ввода (как 2.1, только наоборот =)).

Выражение для замены, в данном случае - "\1", означает вывод первой выделенной строки (см. пункт 2.3).

Deleted
()
Ответ на: комментарий от al1as

> ещё вопрос. как подсчитать количество выводимых папок?
wc -l

power
()
Ответ на: комментарий от Deleted

>sed -n "s/^\/dev\/\(sd[^bc]\)$/\1/p"

sed -ne 's:^/dev/sd[^bc]$:\0:p'

Можно использовать любой символ вместо "/". Иногда это бывает удобно.

Кстати, если судить по моему /proc/partitions, то таки

sed -nre 's:^.*(sd[^bc]|hd.|dm-[0-9]+)$:\1:p' /proc/partitions

linuxfan
()
Ответ на: комментарий от linuxfan

> sed -ne 's:^/dev/sd[^bc]$:\0:p'
> Можно использовать любой символ вместо "/". Иногда это бывает удобно.


Про возможность использования любых символов в качестве разделителей я знал, а вот про "\0" не знал, спасибо =). Кстати, а зачем нужна опция -e?

Deleted
()
Ответ на: комментарий от blade

> спасибо, но, извини, для меня это выглядит как набор символов ))))

Твоя наблюдательность тебя не подвела ;)

pained
()
Ответ на: комментарий от Deleted

>Кстати, а зачем нужна опция -e?

Ну вроде как это "execute script commands". Я по привычке пишу, потому что бывает, когда больше одной команды выполнить надо.

linuxfan
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.