将数组分隔为逗号分隔值

将数组分隔为逗号分隔值

我有一个小片段,它为我提供了当前网络的一些 ip:

#!/bin/bash
read -p "network:" network
data=$(nmap -sP $network | awk '/is up/ {print up}; {gsub (/\(|\)/,""); up = $NF}')

它返回这样的 IP 地址

10.0.2.1
10.0.2.15

等等。

现在我想让它们看起来像这样:

10.0.2.1, 10.0.2.15, ...

我是个 bash 菜鸟,请帮助我:)

答案1

如果您正好需要“,”作为分隔符,您可以使用

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

或者如果你用逗号作为分隔符就足够了,那么

echo "$data" | paste -sd, -

答案2

可以修改您的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,您将始终可以使用它。

这是以 perljoin()函数为模型的,但其命名是join_by为了不与标准join程序(连接文件中的行)冲突。

第一个参数是分隔符。所有剩余的参数都是要连接的数据。

例如:

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

不推荐这种特殊用法。它依赖于 shell 分词未引用的 $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

相关内容