LinuxForum.Fans
Тема

Скрипт для извлечения текста и создания файлов

Автор: TrenAr 6 сообщений 3419 просмотров
#376389

Есть потребность: извлечь из файла /etc/passwd список имён пользователей (до первого двоеточия) и после этого создать по одноимённому файлу для каждого из них во временном каталоге (например: /tmp/root, /tmp/mail, /tmp/user и т.д.). При этом в каждый файл надо дополнительно запихнуть имя пользователя (/tmp/root содержит строку root и т.д.).

Извлечь список оказалось проще простого благодаря команде cut:

text
cut -d: -f1 /etc/passwd

Но что делать дальше - ума не приложу. Скрипт нужен срочно, а знания bash'а пока довольно низкие.
Пробовал всякое-разное, но ничего не работает (не удивительно). Не получилось даже просто файлы создать, не говоря уж о том, чтобы в них имена пользователей записать:

text
cut -d: -f1 /etc/passwd | echo >> /tmp/$@
cut -d: -f1 /etc/passwd >> /tmp/$1
cut -d: -f1 /etc/passwd >> /tmp/${1}
cut -d: -f1 /etc/passwd >> /tmp/${@}
cut -d: -f1 /etc/passwd | for x in "$@"; do echo >> /tmp/${#x}; done
TMPVAR=$(cut -d: -f1 /etc/passwd) && for x in "$TMPVAR"; do echo >> /tmp/$x; done

Помогите, пожалуйста.

#376391

Сразу скажу, я в этом не силен. И решил написать только потому что в шапке упомянуто, что решение нужно срочно. Скорей всего, существует другой, более правильный и корректный вариант.

text
#!/bin/sh

grep -o -E "^\w+" /etc/passwd | while read line do if ! [ -f "/tmp/${line}" ] ; then touch "/tmp/${line}" echo $line > "/tmp/${line}" fi

done

з.ы. написал бы на lua вариант, с ней-то у меня хорошо дела обстоят, но раз в шапке конкретная просьба - указано что именно надо, то пусть будет так

upd: заметил, что неправильно условие прочитал. вместо создания файлов, создавал каталоги скрипт. исправил.

#376392
text

#!/bin/bash
while read i; do
    f=$(echo "$i" | cut -d: -f1)
    touch /tmp/$f
    echo "$f" > /tmp/$f
done < /etc/passwd

Это можно и одностроком записать.

#376397
yars написал:
text

#!/bin/bash
while read i; do
    f=$(echo "$i" | cut -d: -f1)
    touch /tmp/$f
    echo "$f" > /tmp/$f
done < /etc/passwd

Это можно и одностроком записать.

Спасибо!

#376402

[console] sed -r 's~([^:]+):.*~echo \1 > /tmp/\1~pe' /etc/passwd[/console]

#376403

"yars" написал:
touch /tmp/$f
это не нужно

"TrenAr" написал:
f=$(echo "$i" | cut -d: -f1)
и это тоже не нужно, т.к. распарсить строку может и read с ключом -d.
Войдите или зарегистрируйтесь, чтобы ответить.