Help with SED

Anyway, i'm writing a shell script and i read in input with the following:
read $foo

i now want to use this variable in my sed string replacement like so:

sed -i 's/replaceme/$foo' myfile.txt

What i'm getting instead is the literal substitution not what $foo actually equals. Instead i want it to be the input of the user:

-Sid

That's probably not doing what you want. It will not read input into the variable named foo.

Try

read foo

Variables never expand inside single quotes. Try double quotes.

$ var=asdf
$ echo '$var'
$var

$ echo "$var"
asdf

$

may be i did not explain well..

here is the live example..

read -p "Enter your name of rocommunity string you wish to set and press [ENTER]: "  string

sed -i '/rocommunity/s/public/$string/' /opt/adapter/Adapter/snmp/conf/snmpd.conf

here the value of string is "spider..Now do i use to replace with sed command as mentioned above.

---------- Post updated at 12:53 AM ---------- Previous update was at 12:31 AM ----------

Corona688, any suggestion please.

-Siddhesh

You're still putting the variable in single ' ' quotes.

Variables never expand in single ' ' quotes.

Put it in double " " quotes.

Well i tried the same.

the script runs succesfully but the value is not replaced to i pass on when prompted for.

[root@Mediaspire siddhesh]# ./rommonity_new.sh
`/opt/adapter/Adapter/snmp/conf/snmpd.conf' -> `/var/tmp/snmpd.conf_27Mar2012'
`/opt/adapter/ManagementTool/conf/MTInternalConfig.properties' -> `/var/tmp/MTInternalConfig.properties_27Mar2012'
Hello, You are about to change the rocommunity string in  /opt/adapter/Adapter/snmp/conf/snmpd.conf.
Enter your name of rocommunitry string you wish to set andpress [ENTER]:data

It replace the one specified in sed command but not the value for it.
Please advice.

-Siddhesh

Show the input you have and the output you want. Your sed expression may not be right -- without seeing the data it's supposed to match and change, I really can't tell.

Also show the current contents of your script.

I really don't reccomend using things like sed -i without backing up the originals first. Destroying your original configuration files by accident would be a big problem.

#Defining Variable
#------------------------
IP_LIST=/root/IP_LIST
ADAPTER_HOME=/opt/adapter
SNMP=/opt/adapter/Adapter/snmp/conf/snmpd.conf
BACKUP_DIR=/var/tmp
DATE=`date +%Y%m%d%H%M%S`
LOG=/root/community_logs
TMP=/tmp/value

#Backing Up Orginal Files
#-------------------------
echo "Backing up the original configuration file to $BACKUP_DIR" > $LOG.$DATE
cp -pv $ADAPTER_HOME/Adapter/snmp/conf/snmpd.conf $BACKUP_DIR/snmpd.conf_$(date +%d%b%Y)
cp -pv $ADAPTER_HOME/ManagementTool/conf/MTInternalConfig.properties $BACKUP_DIR/MTInternalConfig.properties_$(date +%d%b%Y)
echo "Orignal Log file back-up done succesfully" >$LOG.$DATE

echo "Hello, You are about to change the rocommunity string in  "/opt/adapter/Adapter/snmp/conf/snmpd.conf"."


read -p "Enter your name of rocommunitry string you wish to set andpress [ENTER]:" string

sed -i "/rocommunity/s/public/$string/" /opt/adapter/Adapter/snmp/conf/snmpd.conf

exit 0

I want the value which i enter to be replace in /opt/adapter/Adapter/snmp/conf/snmpd.conf file for rocommunity variable.

-Siddhesh

You've given me is a program that doesn't do what you want. I can't use it to tell tell what you do want. :wall:

You've shown me output that isn't what you want. I can't use it to see what ouptut you do want. :wall:

If you don't show the relevant input and output, I may need to install snmpd myself to have a chance at guessing what you need.

Let me explain you step by step.

  1. There is a file /opt/adapter/Adapter/snmp/conf/snmpd.conf which has a variable as

rocommunity public
rocommunity6 sp1der

  1. I want to use replace the value public with sp1der. i cannot use sed, bcoz customer wants to manually enter the value for this parameter.

Thats it, how do i achieve this. Thanks for bearing me.

-Siddhesh

Thank you.

read COMMUNITY

cp /opt/adapter/Adapter/snmp/conf/snmpd.conf /opt/adapter/Adapter/snmp/conf/snmpd.conf.backup
sed -i "s/rocommunity public/rocommunity $COMMUNITY/" /opt/adapter/Adapter/snmp/conf/snmpd.conf

Hello That worked well.

I also have a IP_LIST file which has ip addresses defined for all node. how do i get this sed command u use the same.

It works for me without "read" variable

IP_LIST=<path_to_file>

for ipaddr in $(cat IP_LIST); do
     ssh ${ipaddr} "sed -i '/rocommunity/s/public/sp1der/' /opt/adapter/Adapter/snmp/conf/snmpd.conf"
done

How do i incorporate in my script

IP_LIST=/root/IP_LIST
read STRING
for ipaddr in $(cat IP_LIST); do
 ssh ${ipaddr}sed -i "s/rocommunity public/rocommunity $STRING/" /opt/adapter/Adapter/snmp/conf/snmpd.conf

When executed it give error as below
Hello, You are about to change the rocommunity string in /opt/adapter/Adapter/snmp/conf/snmpd.conf.
sp1der
./rommonity_new.sh: line 68: syntax error: unexpected end of file
[root@Mediaspire siddhesh]#

Please advice.
-Siddhesh

---------- Post updated at 11:38 AM ---------- Previous update was at 07:33 AM ----------

Hello,

The script worked well.

I need following information. The below mentioned script changes the value of variable rocommunity from public to sp1der on all nodes.

#!/bin/bash

#########################################################################################################
# Shellscript   :       rocommunity_change.sh - To change the community string
# Version        :       V1.0
# Owner          :       Siddhesh Khavnekar <siddhesh.khavnekar@mobixell.com>
# Date           :       2012-03-28
# Category      :       Files Management
#########################################################################################################
# Description   :       This scipt will change rocommuniy from snmpd.conf on all nodes
# IP_LIST       :       Locating all your remote servers' ip addresses in ip_file one per line!
#########################################################################################################

#Defining Variable
#------------------------
IP_LIST=/root/IP_LIST
ADAPTER_HOME=/opt/adapter
SNMP=/opt/adapter/Adapter/snmp/conf/snmpd.conf
BACKUP_DIR=/var/tmp
DATE=`date +%Y%m%d%H%M%S`
LOG=/root/community_logs
TMP=/tmp/value

#Backing Up Orginal Files
#-------------------------
echo "Backing up the original configuration file to $BACKUP_DIR" >> $LOG.$DATE
cp -pv $ADAPTER_HOME/Adapter/snmp/conf/snmpd.conf $BACKUP_DIR/snmpd.conf_$(date +%d%b%Y)
cp -pv $ADAPTER_HOME/ManagementTool/conf/MTInternalConfig.properties $BACKUP_DIR/MTInternalConfig.properties_$(date +%d%b%Y)
echo "Orignal config file back-up done succesfully" >> $LOG.$DATE

echo "Hello, Please enter the name for you wish to set for variable rocommunity string in  "/opt/adapter/Adapter/snmp/conf/snmpd.conf"."

read STRING
for ipaddr in $(cat $IP_LIST); do
ssh ${ipaddr} "sed -i 's/rocommunity public/rocommunity $STRING/' /opt/adapter/Adapter/snmp/conf/snmpd.conf"
done

echo "Hello, Please enter the name for you wish to set for variable rocommunity string in  "/opt/adapter/Adapter/snmp/conf/snmpd.conf"."

read STRING
for ipaddr in $(cat $IP_LIST); do
ssh ${ipaddr} "sed -i 's/rocommunity public/rocommunity $STRING/' /opt/adapter/Adapter/snmp/conf/snmpd1.conf"
done

#Verification of changes done.
#-------------------------------------
grep -w 'ServerSNMPGetArgs' $ADAPTER_HOME/Adapter/snmp/conf/snmpd.conf | grep -w sp1der >> /dev/null

if
[ $(echo $?) = 0 ]; then
echo "rocommunity string set to sp1der sucessfully in MTInternalConfig.properties for ServerSNMPGetArgs." >> $LOG.$DATE
else
echo "Could not set the rocommunity string to sp1der in MTInternalConfig.properties for ServerSNMPGetArgs. Check the file permission." >>  $LOG.$DATE
fi

exit 0

Now in the verfication part it verifies for only one node on which the script is running. I want this to very on all the nodes where it was changed earlier. The IP addresses are already mentioned in IP_LIST file.

#Verification of changes done.
#-------------------------------------
grep -w 'rocommunity' $ADAPTER_HOME/Adapter/snmp/conf/snmpd.conf | grep -w sp1der >> /dev/null

if
[ $(echo $?) = 0 ]; then
echo "rocommunity string set to sp1der sucessfully in MTInternalConfig.properties for ServerSNMPGetArgs." >> $LOG.$DATE
else
echo "Could not set the rocommunity string to sp1der in  MTInternalConfig.properties for ServerSNMPGetArgs. Check the file  permission." >>  $LOG.$DATE
fi

exit 0

Need to change the above mentioned part in code. Please advice.

-Siddhesh

Your code contains many useless uses of cat and useless uses of backticks. If the list of IP's grows large enough, or any of the hostnames contain spaces, your script may malfunction.

Instead of for X in $(cat foo) you should generally do

while read X
do
...
done <inputfile

which can read from any size of file without problems and won't split on spaces, just lines.

Also, you don't need to check the value of $? here. If you put the grep straight into the if-statement itself the effect is the same. So:

while read IP
do
        if ssh "$IP" grep "'^ *rocommunity  *spider *$'" $ADAPTER_HOME/Adapter/snmp/conf/snmpd.conf  >/dev/null </dev/null
        then
                echo "$IP rocommunity set to spider"
        else
                echo "$IP rocommunity not set to spider!"
        fi

# stdin for the entire loop will be $IP_LIST, so the read reads from that file by default
# stdout for entire loop will be $LOG.$DATE, so the echo appends to that file by default
done < $IP_LIST >> $LOG.$DATE