如何使用一些自定义格式以编程方式处理 bash 函数中的空输出
how to programmatically handle null output within a bash function with some custom formatting
我有一个 bash 函数,它使用 result
中的 IP 列表,对于每个 IP,它用作对 return 字符串的数据库查询的一部分。我现在需要帮助的是如何处理输出,如果 IP 没有 return 数据(参见测试输出)
代码:
set -x
demo() {
local result='10.8.3.34
10.8.2.191
10.8.3.54
10.8.4.150
10.8.3.249
10.8.2.197'
read -d '' -a servers <<< $result
echo "Checking ${#servers[@]} servers";
for i in ${servers[@]};
do
local host='10.1.2.130'
local db='myapplication_cluster_state'
_mongo=$(which mongo);
echo -n "$i:";
local exp="db.myapplicationcluster_servers.find(
{\"node_host\":\"${i}\",\"node_type\":\"APP_PROCESS\",\"region\":\"us-east-1\",\"status\":\"ACTIVE\"},{\"partition_range_start\":1,\"partition_range_end\":1, _id:0}).pretty();";
${_mongo} ${host}/${db} --eval "$exp" | grep -o -e "{[^}]*}";
done
}
set +x
demo
我的测试输出:
+ set +x
Checking 6 servers
10.8.3.34:{ "partition_range_start" : 31, "partition_range_end" : 31 }
10.8.2.191:{ "partition_range_start" : 79, "partition_range_end" : 79 }
10.8.3.54:{ "partition_range_start" : 62, "partition_range_end" : 62 }
10.8.4.150:{ "partition_range_start" : 22, "partition_range_end" : 22 }
10.8.3.249:10.8.2.197:{ "partition_range_start" : 16, "partition_range_end" : 16 }
注意:10.8.3.249
没有数据,所以下一个字符串附加为10.8.3.249:10.8.2.197:{ "partition_range_start"
我希望输出格式是这样的:
+ set +x
Checking 6 servers
10.8.3.34:{ "partition_range_start" : 31, "partition_range_end" : 31 }
10.8.2.191:{ "partition_range_start" : 79, "partition_range_end" : 79 }
10.8.3.54:{ "partition_range_start" : 62, "partition_range_end" : 62 }
10.8.4.150:{ "partition_range_start" : 22, "partition_range_end" : 22 }
10.8.3.249:
10.8.2.197:{ "partition_range_start" : 16, "partition_range_end" : 16 }
OR 如果读取的 IP 没有数据,输入一些值,即 EMPTY
10.8.3.34:{ "partition_range_start" : 31, "partition_range_end" : 31 }
10.8.2.191:{ "partition_range_start" : 79, "partition_range_end" : 79 }
10.8.3.54:{ "partition_range_start" : 62, "partition_range_end" : 62 }
10.8.4.150:{ "partition_range_start" : 22, "partition_range_end" : 22 }
10.8.3.249: EMPTY
10.8.2.197:{ "partition_range_start" : 16, "partition_range_end" : 16 }
我怎样才能实现这个输出?谢谢。
将您的 for
循环更改为...
for i in ${servers[@]}
do
local host='10.1.2.130'
local db='myapplication_cluster_state'
_mongo=$(which mongo)
local exp="db.myapplicationcluster_servers.find({\"node_host\":\"${i}\",\"node_type\":\"APP_PROCESS\",\"region\":\"us-east-1\",\"status\":\"ACTIVE\"},{\"partition_range_start\":1,\"partition_range_end\":1, _id:0}).pretty();"
# Store output of mongo command in variable
output=$(${_mongo} ${host}/${db} --eval "$exp" | grep -o -e "{[^}]*}")
# Print {} if output variable is empty
echo "${i}:${output:-{}}"
done
要空着切换 {}
,请使用 echo "${i}:${output:-}"
要将 {}
切换为 EMPTY
,请使用 echo "${i}:${output:- EMPTY}"
正在排序
要对 partition_range_start
的值进行排序,将 demo
函数的输出通过管道传递给 sort
命令...
demo | sort -n -k4
这表示 "sort the output of demo
numerically (-n
) on field 4 (-k4
)"。默认情况下,字段是由空格分隔的字符。
这是 sort
看到的行 10.8.3.34:{ "partition_range_start" : 31, "partition_range_end" : 31 }
...
- 字段 1
10.8.3.34:{
- 字段 2
"partition_range_start"
- 字段 3
:
- 字段 4
31,
- 字段 5
"partition_range_end"
- 字段 6
:
- 字段 7
31
- 字段 8
}
我有一个 bash 函数,它使用 result
中的 IP 列表,对于每个 IP,它用作对 return 字符串的数据库查询的一部分。我现在需要帮助的是如何处理输出,如果 IP 没有 return 数据(参见测试输出)
代码:
set -x
demo() {
local result='10.8.3.34
10.8.2.191
10.8.3.54
10.8.4.150
10.8.3.249
10.8.2.197'
read -d '' -a servers <<< $result
echo "Checking ${#servers[@]} servers";
for i in ${servers[@]};
do
local host='10.1.2.130'
local db='myapplication_cluster_state'
_mongo=$(which mongo);
echo -n "$i:";
local exp="db.myapplicationcluster_servers.find(
{\"node_host\":\"${i}\",\"node_type\":\"APP_PROCESS\",\"region\":\"us-east-1\",\"status\":\"ACTIVE\"},{\"partition_range_start\":1,\"partition_range_end\":1, _id:0}).pretty();";
${_mongo} ${host}/${db} --eval "$exp" | grep -o -e "{[^}]*}";
done
}
set +x
demo
我的测试输出:
+ set +x
Checking 6 servers
10.8.3.34:{ "partition_range_start" : 31, "partition_range_end" : 31 }
10.8.2.191:{ "partition_range_start" : 79, "partition_range_end" : 79 }
10.8.3.54:{ "partition_range_start" : 62, "partition_range_end" : 62 }
10.8.4.150:{ "partition_range_start" : 22, "partition_range_end" : 22 }
10.8.3.249:10.8.2.197:{ "partition_range_start" : 16, "partition_range_end" : 16 }
注意:10.8.3.249
没有数据,所以下一个字符串附加为10.8.3.249:10.8.2.197:{ "partition_range_start"
我希望输出格式是这样的:
+ set +x
Checking 6 servers
10.8.3.34:{ "partition_range_start" : 31, "partition_range_end" : 31 }
10.8.2.191:{ "partition_range_start" : 79, "partition_range_end" : 79 }
10.8.3.54:{ "partition_range_start" : 62, "partition_range_end" : 62 }
10.8.4.150:{ "partition_range_start" : 22, "partition_range_end" : 22 }
10.8.3.249:
10.8.2.197:{ "partition_range_start" : 16, "partition_range_end" : 16 }
OR 如果读取的 IP 没有数据,输入一些值,即 EMPTY
10.8.3.34:{ "partition_range_start" : 31, "partition_range_end" : 31 }
10.8.2.191:{ "partition_range_start" : 79, "partition_range_end" : 79 }
10.8.3.54:{ "partition_range_start" : 62, "partition_range_end" : 62 }
10.8.4.150:{ "partition_range_start" : 22, "partition_range_end" : 22 }
10.8.3.249: EMPTY
10.8.2.197:{ "partition_range_start" : 16, "partition_range_end" : 16 }
我怎样才能实现这个输出?谢谢。
将您的 for
循环更改为...
for i in ${servers[@]}
do
local host='10.1.2.130'
local db='myapplication_cluster_state'
_mongo=$(which mongo)
local exp="db.myapplicationcluster_servers.find({\"node_host\":\"${i}\",\"node_type\":\"APP_PROCESS\",\"region\":\"us-east-1\",\"status\":\"ACTIVE\"},{\"partition_range_start\":1,\"partition_range_end\":1, _id:0}).pretty();"
# Store output of mongo command in variable
output=$(${_mongo} ${host}/${db} --eval "$exp" | grep -o -e "{[^}]*}")
# Print {} if output variable is empty
echo "${i}:${output:-{}}"
done
要空着切换 {}
,请使用 echo "${i}:${output:-}"
要将 {}
切换为 EMPTY
,请使用 echo "${i}:${output:- EMPTY}"
正在排序
要对 partition_range_start
的值进行排序,将 demo
函数的输出通过管道传递给 sort
命令...
demo | sort -n -k4
这表示 "sort the output of demo
numerically (-n
) on field 4 (-k4
)"。默认情况下,字段是由空格分隔的字符。
这是 sort
看到的行 10.8.3.34:{ "partition_range_start" : 31, "partition_range_end" : 31 }
...
- 字段 1
10.8.3.34:{
- 字段 2
"partition_range_start"
- 字段 3
:
- 字段 4
31,
- 字段 5
"partition_range_end"
- 字段 6
:
- 字段 7
31
- 字段 8
}