
У меня есть следующий текст в файле
"rules": [
"/Common/Tetration_TCP_L4_ipfix",
"/Common/_sys_https_redirect"
],
"rulesReference": [
{
"link": "https://localhost/mgmt/tm/ltm/rule/~Common~Tetration_TCP_L4_ipfix?ver=12.0.0"
}
хотите извлечь что-нибудь внутри "rules": []
в настоящее время это
/Common/Tetration_TCP_L4_ipfix
/Common/_sys_https_redirect
Вывод должен выглядеть так:
Tetration_TCP_L4_ipfix
_sys_https_redirect
но опять же это может быть что угодно.
решение1
Если ваш входной файл содержит не полноценный JSON, а только внутренний фрагмент (хотя и структурно корректный), вы можете восстановить недостающие «внешние» части, чтобы получить полную корректную структуру JSON.
sed
+jq
решение:
jq -r '.rules[] | sub("/Common/"; "")' <(sed '1 s/^/{/; $ s/$/]}/' file)
Выход:
Tetration_TCP_L4_ipfix
_sys_https_redirect
Конечно, если у вас действительно есть корректный JSON - просто пропустите sed
обработку и просто используйте:
jq -r '.rules[] | sub("/Common/"; "")' file
решение2
Если это правильно сформированный JSON-файл:
$ jq -r '..|select(type=="object" and has("rules")).rules|map(split("/")|.[-1])|.[]' file.json
Tetration_TCP_L4_ipfix
_sys_https_redirect
Это будет использоваться jq
для рекурсивного поиска всех объектов JSON, имеющих rules
ключ. Для всех значений массива этих ключей он разделит значение /
и вернет последний его компонент.
решение3
С использованиемАВК:
awk -F '[/"]' '/"rules": /,/],/{if(/"rules": |],/) next; print $(NF-1)}' file.txt