Для этого в Solaris используется команда last
.
Это покажет вам последний раз, когда пользователь tim
входил в систему.
bash-[510]$ last -1 tim
tim pts/1 192.168.0.106 Wed Jun 13 18:16 still logged in
Если этот пользователь не входил в систему с момента ротации базы данных, вы не получите никакого вывода.
bash-[511]$ last -1 tom
wtmp begins Fri Mar 27 19:57
-e
означает, что «следующим аргументом командной строки является выражение sed
».-i
означает «выполнить это редактирование в -месте , т.е. изменить исходный файл». Эта опция не является стандартом -и может вызвать путаницу при переходе между различными реализациями sed
в разных системах Unix. См., например. Как добиться переносимости с помощью sed -i (в -редактирование места )?/.*
— это начало регулярного выражения для соответствия тексту, который предполагается заменить. На самом деле это /
, разделитель дляs///
(команды подстановки )в sed
и начало регулярного выражения .*extra_star_job_inlist2_name.*
. .*
само по себе означает «соответствие любому числу любого символа».
.*
также встречается в конце выражения .*extra_star_job_inlist2_name.*
, и в результате любая строка, содержащая строку extra_star_job_inlist2_name
, будет полностью заменена (, т. е. подстановка повлияет не только на строку extra_star_job_inlist2_name
. ] в строке ).
/i
снова является разделителем /
для команды s///
в sed
, за которым следует флаг для команды s///
. Этот флаг не является стандартом -, доступен только в версии GNU sed
. Флаг делает соответствие регистра выражения -нечувствительным. См. документацию GNU sed
об этом.
Странные цитаты вокруг$controls
:
sed
дается в строке с одинарными кавычками. Поскольку это одна строка в кавычках, переменная не будет раскрываться внутри нее. Чтобы вставить значение переменной, сначала должна заканчиваться строка в одинарных кавычках. Это первый '
. "'"
. Они также могли бы использовать здесь \'
. ''
$controls
(без кавычек ). ""
."'"
. sed
продолжается как строка с одинарными кавычками. Есть несколько проблем с кавычками вокруг$controls
:
$controls
не заключено в кавычки. Лучшим вариантом, который позволяет избежать этих проблем, является
sed -i -e "s/.*extra_star_job_inlist2_name.*/extra_star_job_inlist2_name = '$controls'/i" "$MESA_INLIST"
т.е. просто используйте строку в двойных кавычках для всего sed
выражения (, а также правильно заключайте в кавычки $MESA_INLIST
, которые, кстати, не нужно экспортировать сexport
). Это будет работать, если само выражение sed
не содержит обратной косой черты или символов $
(, их необходимо экранировать как \\
и\$
).
Или, чтобы немного сократить его, используйте группу захвата, чтобы захватить строку, которую вы хотите повторить в тексте замены,
sed -i -e "s/.*\(extra_star_job_inlist2_name\).*/\1 = '$controls'/i" "$MESA_INLIST"
(и аналогично для другой команды sed
.)
Чтобы по-прежнему использовать одинарные кавычки перед выражением sed
, вы можете сделать
sed -i -e 's/.*\(extra_star_job_inlist2_name\).*/\1 = '"'$controls'"'/i' "$MESA_INLIST"
Другой оптимизацией будет объединение обоих вызовов sed
в один вызов :
sed -i -e "s/.*\(extra_star_job_inlist2_name\).*/\1 = '$controls'/i" \
-e "s/.*\(extra_controls_inlist2_name\).*/\1 = '$controls'/i" "$MESA_INLIST"