разделение массива на значения, разделенные запятыми

Можно попробовать перемонтировать том только для чтения -. Это работает только в том случае, если на этом томе ничего не открыто для записи.

Вы, вероятно, не избавитесь от состояния гонки, когда файл может быть открыт -только для чтения или что процесс может иметь свой текущий рабочий каталог на этом томе, но если вы отсоедините аппаратное обеспечение, вы, по крайней мере, можете быть уверены. что его файловая система в порядке.

0
27.10.2019, 20:20
2 ответа

Если вам нужно именно ", " в качестве разделителя, вы можете использовать

echo "$data" | xargs | sed -e 's/ /, /g'

или если достаточно запятой в качестве разделителя, то

echo "$data" | paste -sd, -
4
28.01.2020, 02:39

Вы могли бы изменить свой awkскрипт, чтобы он возвращал список IP-адресов, разделенных запятой и пробелом, но объединение списка элементов с определенным разделителем является настолько распространенной задачей, что лучше иметь -полезный инструмент, (скрипт, функцию, скомпилированную программу, что угодно )для этого.

Некоторые языки (, такие как perl), имеют встроенную -такую ​​функцию. К сожалению, bash не входит в их число… но его довольно легко написать:

# perl-like join function for bash
join_by() {local d=$1; shift; printf '%s' "$1"; shift ; printf '%s' "${@/#/$d}"; echo;}

Поместите это в свой ~/.bashrcили ~/.bash_profile, и он всегда будет у вас под рукой.

Эта функция смоделирована на основе функции perl join(), но названа join_by, чтобы не конфликтовать со стандартной joinпрограммой (, которая объединяет строки в файлах ).

Первый аргумент — разделитель. Все остальные аргументы — это данные, которые нужно объединить.

Например:

$ data=$'10.0.2.1\n10.0.2.15'
$ join_by ', ' $data
10.0.2.1, 10.0.2.15

Это конкретное использование не рекомендуется. Он основан на слове оболочки -, разделяющем переменную un -в кавычках$dataна пробельные (пробелы, табуляции, символы новой строки и т. д. ). Это то, чего следует избегать, где это возможно... Я включил это здесь только потому, что вы записываете вывод nmapв одну строковую переменную.

Вместо этого следует использовать массив. Вот так:

data=( $(nmap -sP "$network" | awk '/is up/ {print up}; {gsub (/\(|\)/,""); up = $NF}') )

Это помещает каждый IP-адрес, возвращаемый конвейером nmap | awk, в отдельный элемент массива $data.

вот надуманный пример соединения массива с помощьюjoin_by:

$ data=(10.0.2.1 10.0.2.15)
$ join_by ', ' "${data[@]}"
10.0.2.1, 10.0.2.15
0
28.01.2020, 02:39

Теги

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