$ echo machine23,machine094,machine73,machine83 | tr ',' '\n'
machine23
machine094
machine73
machine83
или если вы действительно хотели сделать это в awk (, возможно, потому что вы хотите выполнить дальнейшую обработку в awk):
$ echo machine23,machine094,machine73,machine83 | \
awk -F',' -v OFS='\n' '{$1=$1;$0=$0;print}'
machine23
machine094
machine73
machine83
Здесь используется хитрый прием awk: если вы измените любое поле (, даже установив его равным самому себе, как в $1=$
), а затем установите $0=$0
, awk переформатирует всю строку ввода -, заменив исходные разделители полей (FS
, запятая в данном случае )с разделителем выходных полей (OFS
, новая строка в данном случае ).
Чтобы получить имя блочного устройства и каждого из его не -пустых дочерних точек монтирования -в виде табуляции -списка с разделителями:
jq -r '
.blockdevices[] | select(.fstype == "crypto_LUKS") as $dev |
$dev.children[]? | select(.mountpoint | type == "string") as $mp |
[ $dev.name, $mp.name ] | @tsv'
Поскольку «нулевая точка монтирования -» на самом деле не null
, а массив из одного значения null
, вместо этого я проверяю, является ли точка монтирования -строкой или нет.
Учитывая данные в вопросе, это вернет
/dev/sdc /dev/mapper/abc2
Чтобы получить объекты блочного устройства, соответствующие критериям (, если это то, что вы подразумеваете под «весь массив»):
jq '.blockdevices[] |
select(.fstype == "crypto_LUKS" and
any(.children[]?;.mountpoint | type == "string"))'
Это возвращает объект блочного устройства, который имеет fstype
значение crypto_LUKS
и имеет по крайней мере один элемент children
с mountpoint
, который является строкой.
Учитывая данные в вопросе, это вернет
{
"name": "/dev/sdc",
"fstype": "crypto_LUKS",
"size": "100G",
"mountpoint": null,
"children": [
{
"name": "/dev/mapper/abc2",
"fstype": "btrfs",
"size": "100GG",
"mountpoint": "/mnt/test"
}
]
}