Вы можете использовать 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 выше избыточной и может быть опущена.