Поскольку вы спрашиваете код awk
, вот один:
awk '/"[^"]*"[[:space:]]*:[[:space:]]*"[^"]*"/ { n++ } END { print n }'
Но для этого больше подходит grep
:
grep -c '"[^"]*"[[:space:]]*:[[:space:]]*"[^"]*"'
Попробуйте пользовательскую функцию ниже. Он принимает список, в котором каждый элемент находится на отдельной строке. См. использование.
contains(){ printf "%s\n" "$1"|grep '^'"$2"'$' > /dev/null; }
Код возврата соответствует команде grep:
Модификации, которые вам могут понадобиться для вышеуказанной функции, чтобы заставить ее работать так, как вы хотите:
&> /dev/null
> /dev/null
2> /dev/null
&& 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 $?
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