Есть ли команда awk для поиска, вошел ли пользователь в систему?

Обратите внимание, что grepсоответствует каждой строке ввода, а не вводу в целом, поэтому обычно не подходит для произвольных строк. Вы можете использовать awkвместо этого (остерегайтесь, что это расширенные регулярные выражения , подобные тем, которые понимаются grep -Eили bash's[[ string =~ regexp ]]).

regexp_match() {
  awk 'BEGIN{if (ARGV[1] !~ ARGV[2]) exit(1)}' "$@"
}

if [ "$a" = y ] || [ "$a" = Y ] && regexp_match "$b" REGEXP; then
  ...
fi

Обратите внимание, что бинарных операторов -a/-o[следует избегать. Они объявлены устаревшими POSIX и имеют ряд проблем. Например, здесь, на FreeBSD:

$ a='(' /bin/sh -c '[ "$a" = y -o "$a" = Y ]'
[: closing paren expected
-2
24.07.2020, 07:24
2 ответа

Просто пример одного из возможных способов использования awk и внешних команд:

is_logged($1) { print $1, "is present!"}

function is_logged(x,a){                     ## a local var
  "who|grep -w " x | getline a
  return a
}

А потом:

$ awk -f test
abc
Darunia

-->Darunia is present!

0
18.03.2021, 23:17
#! /bin/sh -

is_logged_in() {
  who | USER=$1 awk -v ret=1 '
    $1"" == ENVIRON["USER"]"" {ret = 0; exit}
    END {exit(ret)}'
}

if is_logged_in root; then
  echo root is logged in
fi

Определяетis_logged_inфункцию оболочки , которая принимает имя пользователя в качестве аргумента. Мы передаем вывод whoв awk, которому мы передали аргумент функции в переменной окружения USER.

Код awkобрабатывает каждую запись по очереди. Если первое поле в записи равно значению этой переменной окружения (, здесь добавление ""к операндам для принудительного сравнения строк ), тогда мы выходим со статусом выхода 0 (успех ).

Затем эту функцию можно использовать в операторах ifдля проверки того, вошел ли пользователь в систему.

1
18.03.2021, 23:17

Теги

Похожие вопросы