The following is the output of the command ads2 cls create
kernel with pid 7148 (port 9011) killed
kernel with pid 9360 (port 9011) killed
probing service daemon @ http://fdt-c-vm-0093.fdtech.intern:9010
starting kernel FDT-C-VM-0093 @ http://fdt-c-yy-0093.ssbt.intern:9011 name=FDT-C-VM-0093 max_consec_timeouts=10 clustermode=Standard hostname=FDT-C-VM-0093 framerate=20000 schedmode=Standard rtaddr=fdt-c-vm-0093.fdtech.ssbt tickrole=Local tickmaster=local max_total_timeouts=1000
kernel FDT-C-VM-0093 running
probing service daemon @ http://172.16.xx.xx:9010
starting kernel FDT-C-AGX-0004 @ http://172.16.xx.xx:9011 name=FDT-C-AGX-0004 max_consec_timeouts=10 clustermode=Standard hostname=FDT-C-AGX-0004 framerate=20000 schedmode=Standard rtaddr=172.16.xx.xx tickrole=Local tickmaster=local max_total_timeouts=1000
kernel Fxx-x-xxx-xxx4 running
>>> start cluster establish ...
>>> cluster established ...
nodes {
node {
name = "FDT-C-VM-xxxx";
address = "http://fxx-x-xx-0093.xxx.intern:xxxx/";
state = "3";
}
node {
name = "xxx-x-xxx-xxx";
address = "http://1xx.16.xx.xx:9011/";
state = "3";
}
}
However, I'm trying to extract the value of name
and state
for each node, save them in a variable and display them in the following order:
**#example output**
Node fdt-c-agx-xxx has state 3
Node FDT-C-VM-xxx has state 3
Till now i, with the help of this so much powerful learning site, could extract the values of name
and state
by executing the following:
cls="$(ads2 cls create | grep '\(state\|name\) =' | cut -d '"' -f 2)"
Now if i print cls
variable, i get the following:
FDT-C-VM-xxx
3
FDT-C-AGX-xxx
3
First Question:
How can i display the result like the one above in the **#example output**
?
Second question
With this implementation, how can I check the value of state
varaiable for both nodes in order to print something like
if node1State = 3 && node2State = 3; then
echo "Sucess"
else
echo "Failed"
Since the output seems to be json, you should really use a json parser such as jq but in the absence of jq you can use awk and combine the requirements for question one and two:
ads2 cls create | awk -F [\"] '/^>>> cluster established .../ { strt=1 } strt!=1 { next } $1 ~ "name" { cnt++;nam[cnt]=$2 } $1 ~ "state" { stat[cnt]=$2;print "Node "nam[cnt]" has state "$2 } END { if (stat[1]=="3" && stat[2]=="3") { print "Success" } else { print "Failed" } }'
Explanation:
ads2 cls create | awk -F [\"] ' # Set the field delimiter to a double quote
/^>>> cluster established .../ {
strt=1 # If the line starts with ">>> cluster established ...", set a variable strt to 1
}
strt!=1 {
next # If strt is not equal to 1, skip to the next line
}
$1 ~ "name" {
cnt++; # If the first field contains name, increment a cnt variable
nam[cnt]=$2 # Use the cnt variable as the index of an array called nam with the second field the value
}
$1 ~ "state" {
stat[cnt]=$2; # When the first field contains "state", set up another array called stat
print "Node "nam[cnt]" has state "$2 # Print the node name as well as the state
}
END {
if (stat[1]=="3" && stat[2]=="3") {
print "Success" # At the end of processing, use the array to determine whether there is a success of failure.
}
else {
print "Failed"
}
}'