我有一个小片段,它为我提供了当前网络的一些 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