#bash #scripting
#bash #сценарий
Вопрос:
Я очень новичок в написании сценариев на bash (я программирую на python), но иногда мне нужно запустить какой-нибудь простой скрипт на моем ubuntu (на работе), поэтому я начал изучать сценарии на bash.
В любом случае, я хотел бы создать скрипт, который принимал бы 2 аргумента (время начала и окончания) и выдавал бы в качестве результата пользователей, которые вошли в систему между этим временем. В нем также будет указано, сколько раз они входили в систему и общее время, когда они входили в систему.
пример:
$./run 25/4 20/5 <br />
joe 4x 3 days and 11:45 <br />
bob 2x 0 days and 2:17 <br />
smith 17x 21 days and 23:17 <br />
итак, в первом столбце указано, что это за пользователь, во втором указано, сколько раз он входил в систему, в 3-6-м показано общее время, когда он был зарегистрирован. Данные ограничены временем от 25/4 до 20/5 (аргументы)
У меня есть некоторые подсказки, но все они «уродливые». Опять же, я программист на Python, поэтому я привык иметь «красивые» решения.
Я думал сделать это с помощью last
, а затем просто проанализировать текст…
Любые подсказки по коду были бы полезны
лучший k.
Комментарии:
1. Я не могу придумать никакой причины, по которой вы не можете сделать это на python, поскольку это то, что вам больше нравится. Просто создайте скрипт на Python, который анализирует выходные данные
last -F
и отображает то, чего вы хотите достичь.2. весь смысл в этом заключается в изучении сценария bash. если я сделаю это на python, это не достигнет цели.
3. Я понимаю вашу точку зрения, однако для выполнения того, что вы хотите сделать, вам понадобятся инструменты оболочки, такие как
sed
,awk
,grep
и т.д., Которые не являются строго bash, для разбораlast
выходных данных. Следовательно, если вы знаете python лучше всего, используйте его для синтаксического анализа материала. Python, perl, ruby являются такими же действительными инструментами Power shell, какsed
,awk
и др.
Ответ №1:
Приведенный ниже скрипт bash сделает большую часть того, что вы хотите, и я думаю, что в нем достаточно контента, чтобы быть полезным для вас. Однако я действительно не думаю, что такого рода вещи следует делать в bash. Лично я предпочитаю собственный вывод last
тому выводу, который вы описали.
Одна из больших проблем с приведенным ниже скриптом заключается в том, что он не очень переносим. Он работает на моей рабочей станции Ubuntu 11.04, но не на моей рабочей станции RHEL 4 (более старая версия awk несовместима с тем, как я указал разделители).
#!/bin/bash
for user in $(last | head -n-2 | cut -d' ' -f1 | sort | uniq); do
echo -n $user $(last | head -n-2 | cut -d' ' -f1 | grep "^$user$" | wc -l)x
hours=$(last | head -n-2 | grep "^$userb" | awk '{ print $NF }' | grep -v '^in$' | awk -F'[():]' '{ print $2 }' | paste -sd | bc)
minutes=$(last | head -n-2 | grep "^$userb" | awk '{ print $NF }' | grep -v '^in$' | awk -F'[():]' '{ print $3 }' | paste -sd | bc)
days=$(( ($hours $minutes / 60) / 24 ))
hours=$(( ($hours $minutes / 60) % 24 ))
minutes=$(( $minutes % 60 ))
echo -n " $days days and $hours:$minutes"
if last | head -n-2 | grep "^$userb" | grep -qs "still logged in"; then
echo -n ', still logged in'
fi
echo
done