Попытка проверить, содержит ли список элемент в bash/unix, не проверяя подстроки, но включая первый и последний элементы

Поскольку вы спрашиваете код awk, вот один:

awk '/"[^"]*"[[:space:]]*:[[:space:]]*"[^"]*"/ { n++ } END { print n }'

Но для этого больше подходит grep:

grep -c '"[^"]*"[[:space:]]*:[[:space:]]*"[^"]*"'
0
12.06.2019, 18:09
2 ответа

Попробуйте пользовательскую функцию ниже. Он принимает список, в котором каждый элемент находится на отдельной строке. См. использование.

contains(){ printf "%s\n" "$1"|grep '^'"$2"'$' > /dev/null; }

Код возврата соответствует команде grep:

  • 0 -если элемент был найден в списке (полное соответствие строки, с учетом регистра)
  • 1 -, если элемент не найден в списке
  • 2 или выше -при возникновении ошибки (сообщение об ошибке будет напечатано)

Модификации, которые вам могут понадобиться для вышеуказанной функции, чтобы заставить ее работать так, как вы хотите:

  • ничего не печатать, даже возможное сообщение об ошибке:&> /dev/null
  • распечатать все (элемент, если он присутствует в списке, возможное сообщение об ошибке ):удалить> /dev/null
  • печатать, только если элемент присутствует в списке, не печатать возможное сообщение об ошибке:2> /dev/null
  • заставить функцию возвращать только 0 или 1:&& return 0 || return 1;

Использование:

list="$(getent passwd {1000..60000}|cut -f1 -d:)"
item="USER_NAME_HERE"
#or
list="$(printf "%s\n" {1..4})"
item="1"
#then
contains "$list" "$item"
#to see the return code
echo $?
0
28.01.2020, 03:36
users="$(getent passwd | awk -F: '{print $1}')"

contains(){
   grep -qFx "$2" <<< "$1"
}

Проверьте это с помощью чего-то вроде:

if contains "$users" "jim"; then
  echo jim is a user
else
  echo jim is not a user
fi
0
28.01.2020, 03:36

Теги

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