Как использовать pinky для отображения имени пользователя вместо всей информации Bash? - PullRequest
0 голосов
/ 05 февраля 2020
#if argument passed in cannot be found among sessions logged in
function fname(){
result=$(pinky "$1")
if [ ! -f "$result" ] then
       FNAME="NOTFOUND"
return 0
else
       FNAME="$(pinky -f -h)"
return 0
fi
}

любые идеи будут великолепны, спасибо! Я попытался выполнить поиск в Интернете, но не смог найти никаких полезных советов, а также, как я могу проверить, можно ли найти входные данные, является ли тот, который у меня сейчас есть, действительным?

1 Ответ

0 голосов
/ 05 февраля 2020

Вы можете использовать awk для этого. Я не знаю, что представляет ваш $1 аргумент. Если бы мне пришлось угадывать, это имя пользователя. Вот пример вывода pinky:

Login    Name                 TTY      Idle   When             Where
fbar     Foo Bar              pts/0    00:26  2020-02-05 09:32 10.0.0.2
bbaz     Bar Baz              pts/1    00:03  2020-01-27 10:41 10.0.0.3

При условии, что $ 1 будет представлять имя для входа, должно работать следующее:

login_name=$1
pinky | awk -F '[ ]+' "\$1 == \"$login_name\" {print \$2}"

Объяснение:

* Опция 1011 * awk -F определяет разделитель полей и поддерживает регулярные выражения. Таким образом, мы определяем наш разделитель как «по крайней мере 1 пробел», потому что вывод pinky похож на формат типа столбца, где между каждым полем может быть несколько пробелов. При использовании этого в качестве разделителя полей значения поля для пользовательского fbar будут следующими:
$1: fbar
$2: Foo
$3: Bar
$4: pts/0
... We don't really care about the rest.  We got the first name field ($2)

Фактическая часть кода awk равна "\$1 == \"$login_name\" {print \$2}". Обычно лучше использовать одинарные кавычки для кода awk, чтобы избежать всего экранирования, но я хочу включить переменную bash, поэтому я использовал двойные кавычки.

"\$1 == \"$login_name\" Ссылка \$1 первое поле на входе. Мы сравниваем это с нашей bash переменной $login_name в сравнении строк. Мы могли бы оставить переменную bash как $1, но это делает сравнение немного более запутанным (сравнение \$1 с $1). Если это сравнение истинно, мы запускаем следующий бит кода: {print \$2} Это напечатает поле нашего имени.

Примечание: Если пользователь вошел в систему с несколькими сеансами , вы собираетесь получить несколько строк вывода. Если это нежелательно, вы также можете выйти из программы awk при первом совпадении:

pinky | awk -F '[ ]+' "\$1 == \"$login_name\" {print \$2; exit}"

Еще один способ, который может быть чище, - использовать опцию awk -v (назначение переменных), чтобы избежать bash переменные и escape-символы:

pinky | awk -v login="$1" -F '[ ]+' '$1 == login {print $2; exit}'

РЕДАКТИРОВАТЬ: Разделитель поля по умолчанию для awk на самом деле [:space:]+, что близко к тому, что я определил, но включает другие пробелы, такие как вкладки , Это делает опцию -F выше избыточной и может быть опущена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...