LINUX.ORG.RU

Помогите написать скрипт на bash

 


0

1

Нужно вывести в две колонки. В первой вывести всех юзеров, а во второй самый большой файл в каталоге этого юзера. Буду очень благодарен!



Последнее исправление: leave (всего исправлений: 1)
Ответ на: комментарий от infomeh

я пробовал сделать все по-отдельности типо первая команда вывод все юзеров:sed ‘s/:.*//’ /etc/passwd а вторая найти самые большие файлы: find -type f ls -s ivan|sort -n -r |head -5 а вот как их обьединить понятия не имею

ivan_hulak
() автор топика

вывести в две колонки. В первой вывести всех юзеров

Команда называется «в колонну по два становись».

Nervous ★★★★★
()
Ответ на: комментарий от n008_b4800n

если поможете могу скинуть пару рублей на карту просто препод задал задание и не знаю как сделать, а завтра нужно дать ответ А вообще может поможете бедному студенту))))

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

Используй его команду find, с помощью нее ты найдешь файлы в /home/username/ для всех пользователей, с помощью неё же сможешь вывести размер файла, с помощью sort сделать сортировку по размеру, а с помощью head получить самый большой ( верхний ) файл.

И ты можешь не читать passwd файл, а получить список домашних директорий в /home хотя бы с помощью того же find.

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

infomeh ★★
()
Ответ на: комментарий от ivan_hulak

спасибо очень помогли

Скоро пригодится.

Nervous ★★★★★
()
Ответ на: комментарий от ivan_hulak

Решение любого задания или проблемы должно начинаться с построения алгоритма, далее с нахождения способов реализации этапов алгоритма.

И я более чем уверен, что тебе были даны материалы с примерами команд и указанием где и как искать документацию.

infomeh ★★
()
Ответ на: комментарий от ivan_hulak

Проблема в том, что ты генерируешь тупняк, откровенный %-(

Реально, почему я в 2000 году бежал покупал книжку изд-ва ОРайли Unix Power tools? Я реально долбанутым был? Или всё же мне нужна была книдка, чтобы прочитать рецепты, которых там щедро налили.

Открываю старшную джидайскую тайну - за 20 лет не сильно в сосноле вещи поменялись.

anonymous
()

Вместо обработки /etc/passwd лучше обрабатывать вывод команды getenet

turtle_bazon ★★★★★
()

Домашку за бесплатно тебе делать не будем

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

Ну ты сначала получи список юзеров, потом загони их в for, там у тебя будет переменная пользователя как раз. И по этой переменной find выполнишь.

turtle_bazon ★★★★★
()

кого вывести в две колонки, linux?

buratino ★★★★★
()
Ответ на: комментарий от ivan_hulak

проблема в том, что мне нужно вывести в две колонки

Простыми средствами выводить можно только строки, по этому сначала делаешь разбор файла passwd и переписываешь имена пользователей и их домашние директории в массив users($u_num, (name/home_path selector))

Потом берёшь из этого массива домашнею директорию и ищешь в ней самый большой файл.

Потом делаешь примерно такое

echo user name: $u_name $path_to_max_size_of_file

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

А про это дьявольское сочетание и думать не охота. :)

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

Чем это он не логичен? [code] вывод команды | while read username do поиск /home/$username параметры_для_вывода_размера | команда_сортировки … done [/code]

Не надо говорить, что что-то нелогично, если ты не умеешь это использовать.

С твоим for тебе нужно в начале посчитать сколько строк ты будешь обрабатывать на вход. А с while не надо, если что-то попало на вход - обрабатывай.

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

Чем это он не логичен?

 
вывод_команды | while read username
do
  поиск /home/$username параметры_для_вывода_размера | команда_сортировки
…
done

Не надо говорить, что что-то нелогично, если ты не умеешь это использовать.

С твоим for тебе нужно в начале посчитать сколько строк ты будешь обрабатывать на вход. А с while не надо, если что-то попало на вход - обрабатывай.

PS: Зачем по умолчанию поставили маркдаун? Это же жесть.

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

PS: Зачем по умолчанию поставили маркдаун? Это же жесть.

Это как раз пример как я не знаю markdown точно так же, как кто-то не знает while.

anonymous
()
awk -F: '{print $1, $6}' /etc/passwd \
    | while read -r username homedir; do \
    find "$homedir" -type f -printf "%s %p\n" 2>/dev/null \
    | sort -k1 | tail -1 | awk -vUSERNAME="$username" '{print USERNAME, $1, $2}'; done \
    | sort -k1 | column -t
anonymous
()
Ответ на: комментарий от anonymous

Ну и нафейхуа ты всё это написал?

Как автору учиться думать?

Как он это потом преподавателю объяснит и если он его попросит изменить поведение, то как он его изменит, если не будет понимать?

А я бы попросил.

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

Я же две загадки оставил: как убрать лишнюю колонку и почему в выводе юзеров меньше, чем в /etc/passwd.

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

Пайп можно тоже как символ переноса использовать.

Кстати, интересно:

$ awk -F: '{print $1, $6}' /etc/passwd

***
systemd-coredump /
***

YAR ★★★★★
()
Последнее исправление: YAR (всего исправлений: 1)
Ответ на: комментарий от infomeh

Воу-воу, не путай человека. Хомяк юзера может быть и не в /home.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от ivan_hulak

Предлагаю тупой алгоритм в лоб, реализацию на bash рожать не буду.

Берётся цикл для каждого юзера. В теле цикла смотрится в его каталог и ищется самый большой файл. Потом собирается строка echo $USERNAME $FILENAME. Как выравнять колонки - не знаю, но можно что нибудь придумать с символами табуляции или на худой конец с подсчётом длинн строк.

kirill_rrr ★★★★★
()
Последнее исправление: kirill_rrr (всего исправлений: 1)
Ответ на: комментарий от turtle_bazon

Ну не знаю

Поддерживаю @kirill_rrr . Воспользуйся «Поиском» ЛОРа. Это очень часто употребляемая конструкция.

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

И -P, и ‘./’ - дефолтные опции. Указывать из не обязательно.

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

Advanced Bash-Scripting Guide Искусство программирования на языке сценариев командной оболочки Автор: Mendel Cooper thegrendel@theriver.com Перевод: Андрей Киселев kis_an@mail.ru

Нагуглите эту штуку. Там куча примеров и удобное оглавление, а главное всё очень понятно. К сожалению указанный автором адрес пустой, но находится куча других копий.

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

Спасибо за рекомендации, но есть опыт написания http сервера на bash. Так что не знаю насколько оно поможет. Я просто привёл по ссылке использование while read, котороые и выглядит довольно вырвиглазно, и которое на практике приходится применять.

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

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

Какая к чорту ещё скрипка? Это самая распространённая конструкция в таких задачах. Пользуй «поиск» ЛОРа.

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

Файнд вываливает список файлов, а while read крутит цикл для каждого элемента списка.

kirill_rrr ★★★★★
()
Ответ на: комментарий от turtle_bazon

http сервера на bash

Вы знаете толк в извращениях…

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

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