Способ awk
:
$ awk 'NR != $1 { for (i = prev + 1; i < $1; i++) {print i} } { prev = $1 + 1 }' file
3
5
6
7
9
Более четко:
awk 'NR != $1 {
for (i = prev + 1; i < $1; i++) {
print i
}
}
{
prev = $1
}'
Для каждой строки я проверяю, совпадает ли номер строки с номером, и если нет, печатаю каждое число между предыдущим (prev
) и текущим (эксклюзивным, поэтому i = prev + 1
).
В соответствии с вашим мнением об основных командах, если структура вашего файла точно такая, как показано, grep
может вам помочь:
$ grep -B2 -A3 '"name" : "Admin_UserGroup"' File
но если все в одну строку:
$ sed -E 's/\},\s*\{/\},\n\{/g' File | grep '"name" : "Admin_UserGroup"'
Используя исходный пример, вы бы использовали мое решение следующим образом:
$ echo "$Group_ID" | grep...
Использованиеjq
:
$ printf '%s\n' "$Group_ID" | jq '.[] | select(.name == "Admin_UserGroup")'
{
"id": "89f3bd6a-33a9-4e02-9fe3-eae660c5a6cf",
"name": "Admin_UserGroup",
"path": "/Admin_UserGroup",
"subGroups": []
}
Это выбирает все объекты в массиве, чей ключ name
соответствует значению Admin_UserGroup
.
Вы можете использовать JSON.awk:
awk -f JSON.awk -v file1.json file2.json
В последних версиях ksh93
вы можете анализировать данные json в составную переменную ksh93 с помощьюread -m json
:
print -r -- "$Group_ID" | IFS= read -rm json v
for ((i = 0; i < ${#v[@]}; i++)); do
if [[ ${v[i].name} = Admin_UserGroup ]]; then
print -r -- "${v[i]}"
fi
done
Выводит:
(
id=89f3bd6a-33a9-4e02-9fe3-eae660c5a6cf
name=Admin_UserGroup
path=/Admin_UserGroup
typeset -C subGroups
)
Вместо print -r -- "${v[i]}"
вы можете вывести ${v[i].path}
или любую другую информацию из этой составной переменной.
$ awk '{if($0~/"AdminUserGroup"/) {NR=NR-1;print $0; NR=NR+2;print $0; } }'file1
Таким образом мы можем вывести информацию о строках рядом с искомой строкой. Также я думаю, что вместо того, чтобы печатать его, мы можем также поместить все это в массив:
$ awk '{if($0~/"AdminUserGroup"/) {NR=NR-1;arr[$i]=(print $0);i=$((i+1)); \
NR=NR+2; arr[$i]=(print $0); } }'file1.
Затем мы можем использовать детали массива.