Bash : More parameter expansion and IFS


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Bash : More parameter expansion and IFS
# 1  
Old 06-05-2018
Bash : More parameter expansion and IFS

I am trying to become more fluent with the interworking of bash and minimize the number of external calls.

Sample Data. This will be the response of the snmp query.
Code:
SNMPv2-MIB::sysName.0 = STRING: SomeHostName
SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.9.1.1745
SNMPv2-MIB::sysDescr.0 = STRING: Cisco IOS Software, IOS-XE Software, Catalyst L3 Switch Software (CAT3K_CAA-UNIVERSALK9-M), Version 03.06.08.E RELEASE SOFTWARE (fc1)

I would like to extract as follows:
Code:
sysD=03.06.08.E 
sysN=SomeHostName
sysO=1745

The code given below does this. But its ugly and is very dependant on external calls.

I reviewed Chris FA Johnsons site / link Extracting parts of a string by Chris F.A. Johnson and reviewed a few books I have written by him and looked at web resources and dont find a good method to execute the same without external calls.

Is there anyway I can isolate these pieces of information without external calls ?

Code:
 
sult=$($SNMPG $RW -v2c -mALL $i sysDescr.0 sysName.0 sysObjectID.0 2>/dev/null)
sysD=$(echo "$sult" | grep "sysDescr" | sed 's/.*, Version //g; s/ RELEASE.*//g; s/,$//g')
sysN=$(echo "$sult" | grep "sysName" | awk '{print $NF}')
sysO=$(echo "$sult" | grep "sysObjectID" | sed 's/.*enterprises//g' | cut -d"." -f4)
printf "%s," "$sysN" "$sysD" "$sysO";printf "%s\n" | tee -a ofil.csv

Thanks for all your help !!

Last edited by RudiC; 06-05-2018 at 02:18 PM..
# 2  
Old 06-05-2018
How about
Code:
while read line
  do    [[ "$line" =~ sysName ]]         && sysN=${line##* }
        [[ "$line" =~ sysObjectID ]]     && sysO=${line##*.}
        [[ "$line" =~ sysDescr ]]        && { TMP=${line##*Version }; sysD=${TMP%% RELEASE*}; }
  done <<< $($SNMPG $RW -v2c -mALL $i sysDescr.0 sysName.0 sysObjectID.0 2>/dev/null)
 echo $sysD, $sysO, $sysN
03.06.08.E, 1745, SomeHostName

This User Gave Thanks to RudiC For This Post:
# 3  
Old 06-05-2018
bash supports regex, tried that?
Code:
string="SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.9.1.1745"
regex1="sysObjectID"
regex2="[0-9]{4}$"
if [[ "$string"  =~ $regex1 ]] then 
   [[ "$string" =~ $regex2 ]] then
      echo "matched part is ${BASH_REMATCH[1]}"
   fi
fi

Edit: Rudi beat me to it.
This User Gave Thanks to jim mcnamara For This Post:
# 4  
Old 06-05-2018
As general note - some bash regex strings fail when used directly on the command line. Spaces in regex are an example.
It is probably best practice to make them variables:
bash - Capturing Groups From a Grep RegEx - Stack Overflow
Dennis Williamson's answer comment section
This User Gave Thanks to jim mcnamara For This Post:
# 5  
Old 06-05-2018
Tsch .. thanks. You guys are wizards Smilie !

Cant quite put it all together. Maybe someday when I grow up Ill be a wizard too !!

Thanks fellas !!

---------- Post updated at 02:10 PM ---------- Previous update was at 01:56 PM ----------

... lightning fast too !
# 6  
Old 06-05-2018
If I see many if [[ $var in a row then it's time to think of a case-esac.
But it uses a whole line glob match, not a regular expression.
Here a leading and trailing * allow preceding and succeeding characters (while a regular expression does not need leading/trailing .*)
Code:
while read line
do
  case $line in
  (*sysName*) sysN=${line##* } ;;
  (*sysObjectID*) sysO=${line##*.} ;;
  (*sysDescr*) TMP=${line##*Version }; sysD=${TMP%% RELEASE*} ;;
  esac
done < <($SNMPG $RW -v2c -mALL $i sysDescr.0 sysName.0 sysObjectID.0 2>/dev/null)
printf "%s,%s,%s\n" "$sysN" "$sysD" "$sysO"

I also replaced the "herestring made of a command substitution" <<< $( ) by a "process substitution" < <( ).
These 2 Users Gave Thanks to MadeInGermany For This Post:
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Use parameter expansion over a parameter expansion in bash.

Hello All, Could you please do help me here as I would like to perform parameter expansion in shell over a parameter expansion. Let's say I have following variable. path="/var/talend/nat/cdc" Now to get only nat I could do following. path1="${path%/*}" path1="${path1##*/}" Here... (8 Replies)
Discussion started by: RavinderSingh13
8 Replies

2. Shell Programming and Scripting

Bash : Parameter expansion ${var:-file*}

Example data $ ls *somehost* 10.10.10.10_somehost1.xyz.com.log 11.11.11.11_somehost2.xyz.com.log #!/bin/bash #FILES="*.log" FILES=${FILES:-*.log} for x in $FILES do ip="${x%%_*}" # isolate IP address x="${x##*_}" # isolate hostname hnam="${x%.*}" # Remove the ".log"... (2 Replies)
Discussion started by: popeye
2 Replies

3. Shell Programming and Scripting

Bash Parameter Expansion

#!/bin/bash SNMPW='/usr/bin/snmpwalk' while read h i do loc=$($SNMPW -v3 -u 'Myusername' -l authPriv -a SHA -A 'Password1' -x AES -X 'Password2' $i sysLocation.0 2>/dev/null) loc=${loc:-" is not snmpable."} loc=${loc##*: } loc=${loc//,/} echo "$i,$h,$loc" done < $1 My question is ... ... (1 Reply)
Discussion started by: sumguy
1 Replies

4. Shell Programming and Scripting

Bash Parameter Expansion

I have made the following examples that print various parameter expansions text: iv-hhz-sac/hpac/hhz.d/iv.hpac..hhz.d.2016.250.070018.sac (text%.*): iv-hhz-sac/hpac/hhz.d/iv.hpac..hhz.d.2016.250.070018 (text%%.*): iv-hhz-sac/hpac/hhz (text#*.): d/iv.hpac..hhz.d.2016.250.070018.sac... (2 Replies)
Discussion started by: kristinu
2 Replies

5. Shell Programming and Scripting

Bash IFS

I am using bash and resetting IFS as below when reading the command line arguments. I do this so I can call my script as in Ex1. Ex1: ./synt2d-ray3dmod.bash --xsrc=12/20/30 This allows me to split both sides so that when I do "shift" I can get 12/20/30 What I do not understand is... (21 Replies)
Discussion started by: kristinu
21 Replies

6. UNIX for Dummies Questions & Answers

Parameter Expansion with regular expression

Hello experts, I am exploring parameter expansion, and trying to cut the fields in a URL. Following is the requirement: I have // abc.nnt /dir1/dir2/dir3/dir4/somefile.java What i need to get is the path after dir3, and dir3 will be passed. output that i need is... (1 Reply)
Discussion started by: gjarms
1 Replies

7. Shell Programming and Scripting

Parameter expansion not working for all strings...

I'm trying to write a script that parses my music collection and hard link some filenames that my media player doesn't like to other names. To do this I need to extract the name and remove alla non ASCII characters from that and do a cp -l with the result. Problem is this: 22:16:58 $... (8 Replies)
Discussion started by: refuser
8 Replies

8. Shell Programming and Scripting

Bash parameter expansion from a config file

Hi - I am trying to do a simple config file with known variable names in it, e.g.: contents of config file a.conf: -a -b $work -c $host simplified contents of bash script file: work='trunk' host='alaska' opts=$(tr '\n' ' ' < a.conf) opts="$opts $*" mycommand $opts arg1 arg2 The... (3 Replies)
Discussion started by: mrengert
3 Replies

9. Shell Programming and Scripting

Need help with parameter expansion

Say you have this numeric variable that can be set by the user but you never want it to leave a certain range when it gets printed. How could you use parameter expansion such that it will never expand outside of that boundary? Thanks ---------- Post updated at 11:09 PM ---------- Previous update... (3 Replies)
Discussion started by: stevenswj
3 Replies

10. Shell Programming and Scripting

removing html tags via parameter expansion

Hi all- I have a variable that contains a web page: echo $STUFF <html> <head> <title>my page</title></head> <body> blah blah etc.. Can I use the shell's parameter expansion abilities to remove just the tags? I thought that FIXHTML=${STUFF//<*>/} might do it, but it didn't seem to... (2 Replies)
Discussion started by: rev66
2 Replies
Login or Register to Ask a Question