I have tried to come with below bash script which is at least working for me, i know its not perfect and that why i want some review and suggestion to make it more aligned with bash practices. I'm trying to read bash manuals and seeking help from google and stackoverflow questions and answers.
I'm not able to explain well thus not getting fruitful help.. but that's the way it works :-) .
Below is my working code which basically have a array_list
of volumes like array_fxn1 ...
which i'm taking from a file file and then building them and further making sure if ldap_volList
is not empty at the same time and then doing some for loop over the array_list
further doing check and then ssh to the Server to run the command and do some sum of the certain columns.
As you may see, its always relative to array_list or say volume_list, for an example if its array_fxn1=
then its dbcl101
, if its array_fxn2=
then its dbcl201
and so on ..
array_fxn1 then fxn101
array_fxn2 then fxn201
array_fxn3 then fxn301
array_fxn4 then fxn401
but i am not getting that logic build so come to the below one which can work for me being not an expert.
Any suggestion, will be much much appreciated.
my code:
#!/bin/bash
#
read -rp "Please Enter LDAP Project Name: " ldap_proj
ldap_volList=$(cat ldap-project-nismap.csv |grep "$ldap_proj" | tr "," "\t"| awk '{print $NF}'| tr -d '"')
# Build an array list of desired Volumes beforehand to make it more precise
array_fxn1=$(echo "$ldap_volList" | grep ^fxn1)
array_fxn2=$(echo "$ldap_volList" | grep ^fxn2)
array_fxn3=$(echo "$ldap_volList" | grep ^fxn3)
array_fxn4=$(echo "$ldap_volList" | grep ^fxn4)
array_fxn6=$(echo "$ldap_volList" | grep ^fxn6)
array_fxn7=$(echo "$ldap_volList" | grep ^fxn7)
array_fxn8=$(echo "$ldap_volList" | grep ^fxn8)
# Place a check to ensure the Volumelist is not empty and then loop over the volume array's
if [[ ! -z "$ldap_volList" ]]; then
for i in $array_fxn1;
do
volstyle=$(ssh dbcl101 "row 0; vol show $i -fields volume-style-extended" |awk '/fxn/{print 3ドル}')
if [[ "$volstyle" == "flexvol" ]];then
echo -n "$ldap_proj:$i "
ssh dbcl101 "row 0;set -unit MB; \
vol show-footprint $i -fields volume-blocks-footprint-bin0,volume-blocks-footprint-bin1,total-footprint"||awk '/^stv/{s1+=3ドル; s2+=4ドル; s3+=5ドル } END {print s1, s2, s3}'
fi
done
for i in $array_fxn2;
do
volstyle=$(ssh dbcl201 "row 0; vol show $i -fields volume-style-extended" |awk '/fxn/{print 3ドル}')
if [[ "$volstyle" == "flexvol" ]];then
echo -n "$ldap_proj:$i "
ssh dbcl201 "row 0;set -unit MB; \
vol show-footprint $i -fields volume-blocks-footprint-bin0,volume-blocks-footprint-bin1,total-footprint"||awk '/^stv/{s1+=3ドル; s2+=4ドル; s3+=5ドル } END {print s1, s2, s3}'
fi
done
for i in $array_fxn3;
do
volstyle=$(ssh dbcl301 "row 0; vol show \$i -fields volume-style-extended" |awk '/fxn/{print 3ドル}')
if [[ "$volstyle" == "flexvol" ]];then
echo -n "$ldap_proj:$i "
ssh dbcl301 "row 0;set -unit MB; \
vol show-footprint \$i -fields volume-blocks-footprint-bin0,volume-blocks-footprint-bin1,total-footprint"|awk '/fxn/{print 3,ドル4,ドル5ドル}'
fi
done
for i in $array_fxn4;
do
volstyle=$(ssh fxn401 "row 0; vol show \$i -fields volume-style-extended" |awk '/fxn/{print 3ドル}')
if [[ "$volstyle" == "flexvol" ]];then
echo -n "$ldap_proj:$i "
ssh dbcl401 "row 0;set -unit MB; \
vol show-footprint \$i -fields volume-blocks-footprint-bin0,volume-blocks-footprint-bin1,total-footprint"|awk '/fxn/{print 3,ドル4,ドル5ドル}'
fi
done
for i in $array_fxn6;
do
volstyle=$(ssh dbcl601 "row 0; vol show \$i -fields volume-style-extended" |awk '/fxn/{print 3ドル}')
if [[ "$volstyle" == "flexvol" ]];then
echo -n "$ldap_proj:$i "
ssh dbcl601 "row 0;set -unit MB; \
vol show-footprint \$i -fields volume-blocks-footprint-bin0,volume-blocks-footprint-bin1,total-footprint"|awk '/fxn/{print 3,ドル4,ドル5ドル}'
fi
done
for i in $array_fxn7;
do
volstyle=$(ssh dbcl701 "row 0; vol show \$i -fields volume-style-extended" |awk '/fxn/{print 3ドル}')
if [[ "$volstyle" == "flexvol" ]];then
echo -n "$ldap_proj:$i "
ssh dbcl701 "row 0;set -unit MB; \
vol show-footprint \$i -fields volume-blocks-footprint-bin0,volume-blocks-footprint-bin1,total-footprint"|awk '/fxn/{print 3,ドル4,ドル5ドル}'
fi
done
for i in $array_fxn8;
do
volstyle=$(ssh dbcl804 "row 0; vol show \$i -fields volume-style-extended" |awk '/fxn/{print 3ドル}')
if [[ "$volstyle" == "flexvol" ]];then
echo -n "$ldap_proj:$i "
ssh dbcl804 "row 0;set -unit MB; \
vol show-footprint \$i -fields volume-blocks-footprint-bin0,volume-blocks-footprint-bin1,total-footprint"|awk '/fxn/{print 3,ドル4,ドル5ドル}'
fi
done
fi
Output:
$ bash new_test.sh
Please Enter LDAP Project Name: web3
web3:fxn1002_web3_wiki 14030MB 13292MB 0MB
web3:fxn1002_web3_wvg 690194MB 679021MB 0MB
web3:fxn1002_web3_wso 70MB 38MB 0MB
UPDATE ON THE POST:
CVS DATA Sample:
Location,ProjectName,NisMap,"Total(GB)","Used(GB)","Used_Percentage",Quality,Id,volumeName
"DC_oregon-DC01",dnpc,"dbc2002:/proj/dbc2002_dnpc_eaeagle_pd2/q",1000,"761.87",76,economy,"eaeagle_pd2","dbc2002_dnpc_eaeagle_pd2"
"DC_oregon-DC01",dnpc,"dbc2002:/proj/dbc2002_dnpc_eaeagle2_7/q",4096,"3536.99",86,scratch,"eaeagle2_7","dbc2002_dnpc_eaeagle2_7"
"DC_oregon-DC01",dnpc,"dbc2002:/proj/dbc2002_dnpc_eaeagle2_6/q",4096,"2976.74",73,scratch,"eaeagle2_6","dbc2002_dnpc_eaeagle2_6"
"DC_oregon-DC01",dnpc,"dbc2002:/proj/dbc2002_dnpc_eaeagle2_5/q",4096,"3111.61",76,economy,"eaeagle2_5","dbc2002_dnpc_eaeagle2_5"
"DC_oregon-DC01",dnpc,"dbc2002:/proj/dbc2002_dnpc_eaeagle2_4/q",4096,"3595.16",88,economy,"eaeagle2_4","dbc2002_dnpc_eaeagle2_4"
"DC_oregon-DC01",dnpc,"dbc2002:/proj/dbc2002_dnpc_eaeagle2_3/q",4096,"2296.67",56,economy,"eaeagle2_3","dbc2002_dnpc_eaeagle2_3"
NetAPP command data:
1)
$ ssh dbcl101 "row 0; vol show fxn1002_dbdesk_scratch -fields volume-style-extended" |awk '/fxn/{print 3ドル}'
flexvol
the above command I am making sure if the output returns flexvol
.
$ ssh dbcl101 "row 0; vol show fxn1002_dbdesk_scratch -fields volume-style-extended"
Last login time: 7/17/2022 21:38:02
(rows)
vserver volume volume-style-extended
------- -------------------------- ---------------------
fxn1002 fxn1002_dbdesk_scratch flexvol
The above one is full command which have volume type
like we have in previous command which contains the flexvol
and that's what we are getting store via awk
to a variable.
- The below NetApp command returns the size of a volume.
--
$ ssh dbcl101 "row 0; vol show-footprint fxn1002_dbdesk_scratch -fields volume-blocks-footprint-bin0,volume-blocks-footprint-bin1,total-footprint"
Last login time: 7/17/2022 21:39:26
(rows)
vserver volume total-footprint volume-blocks-footprint-bin0 volume-blocks-footprint-bin1
------- -------------------------- --------------- ---------------------------- ----------------------------
fxn1002 fxn1002_dbdesk_scratch 880.4GB 18.91GB 854.8GB
fxn1002 fxn1002_dbdesk_scratch 880.4GB 18.91GB 854.8GB
$ ssh dbcl101 "row 0; vol show-footprint fxn1002_dbdesk_scratch -fields volume-blocks-footprint-bin0,volume-blocks-footprint-bin1,total-footprint"|awk '/fxn/{print 3,ドル4,ドル5ドル}'
880.4GB 18.91GB 854.8GB
The above one again the same command which does the print the field 2, 3 & 4
.
-
2\$\begingroup\$ I made a guess as to what the script does and retitled the question according to our site guidelines. It would be helpful if you added a sample of what your CSV contains and what the NetApp command output looks like. \$\endgroup\$200_success– 200_success2022年07月16日 17:05:06 +00:00Commented Jul 16, 2022 at 17:05
-
1\$\begingroup\$ @200_success, thanks for the remark, let me update the Question. \$\endgroup\$user294110– user2941102022年07月18日 04:54:42 +00:00Commented Jul 18, 2022 at 4:54
2 Answers 2
I have no idea of what you are trying to achieve, but still here we go.
Less indentation is better than more indentation. Compare
if condition; then do_plenty_of_work fi
vs
if not condition; then return fi do_plenty_of_work
Second version is much more readable. I don't have to scroll down to see that there is no
else
.Don't Repeat Yourself (aka DRY). All your
for
loops are identical; only the server name, and the array name differ, and they differ in a very regular way. Lift the common code into a function:do_stuff() { array=$(echo "$ldap_volList" | grep ^fxn${1}) server = "dbcl"${1}"01" for i in $array; do volstyle=$(ssh ${server} "row 0; vol show $i -fields volume-style-extended" |awk '/fxn/{print 3ドル}') if [[ "$volstyle" == "flexvol" ]];then echo -n "$ldap_proj:$i " ssh ${server} "row 0;set -unit MB; \ vol show-footprint $i -fields volume-blocks-footprint-bin0,volume-blocks-footprint-bin1,total-footprint"|awk '/fxn/{print 3,ドル4,ドル5ドル}' fi done
and call it in a loop:
for i in {1..8}: do do_stuff ${i} done
-
\$\begingroup\$ @ vnp , thanks for the answer, i am updating my question to make it little more clear. \$\endgroup\$user294110– user2941102022年07月18日 04:55:27 +00:00Commented Jul 18, 2022 at 4:55
-
\$\begingroup\$ I have updated my Post in case it make it more clear. \$\endgroup\$user294110– user2941102022年07月18日 15:58:25 +00:00Commented Jul 18, 2022 at 15:58
While going through your post and your requirement as I understand where you are looking for below string
match, for this to solve better I would use regexp matches =~
and Bash logical (&&) operator where &&
lets you do something based on whether the previous command completed successfully - that's why you tend to see it chained as do_something
&&
array_fxn1 then fxn101
array_fxn2 then fxn201
array_fxn3 then fxn301
array_fxn4 then fxn401
Below is something I'll try if I would be you, I'm not a Storage expert and NetAPP access hence can not try any more, please give it a try ..
#!/bin/bash
##
read -rp "Please Enter LDAP Project Name: " ldap_proj
ldap_volList=$(grep "$ldap_proj" ldap-project-nismap.csv | tr "," "\t"| awk '{print $NF}'| tr -d '"')
for vols in $(echo "$ldap_volList");
do
[[ $vols =~ ^fsx1 ]] && ssh_server="dbcl101";
[[ $vols =~ ^fsx2 ]] && ssh_server="dbcl201";
[[ $vols =~ ^fsx3 ]] && ssh_server="dbcl301";
[[ $vols =~ ^fsx4 ]] && ssh_server="dbcl401";
[[ $vols =~ ^fsx5 ]] && ssh_server="dbcl501";
[[ $vols =~ ^fsx6 ]] && ssh_server="dbcl601";
[[ $vols =~ ^fsx7 ]] && ssh_server="dbcl701";
[[ $vols =~ ^fsx8 ]] && ssh_server="dbcl804";
volstyle=$(ssh "$ssh_server" "row 0; vol show $vols -fields volume-style-extended" |awk '/fsx/{print 3ドル}')
if [[ "$volstyle" == "flexvol" && ! -z "$ssh_server" ]];then
echo -n "$ldap_proj:$vols "
ssh $ssh_server "row 0;set -unit MB; \
vol show-footprint $vols -fields volume-blocks-footprint-bin0,volume-blocks-footprint-bin1,total-footprint" \
|awk '/fsx/{print 3,ドル4,ドル5ドル}'
fi
done
Now, you don't need to run for loop
multiple times.