Solved

Would like to search and replace specific string in file in one directory (linux)

Posted on 2008-10-28
10
277 Views
Last Modified: 2013-12-16
Hi,

I would like to request an assistant.

May i know how to create a script to search and replace a few string in a file ?

Attached is the dns zone file in which i would like to do the following :

1. search all files in a directory ended with ".db" and replace all string "600" to "14400"
2. After that replacing the specific string below :

From :

                600             ; refresh, seconds
                600             ; retry, seconds
                600             ; expire, seconds
                600 )           ; minimum, seconds

to :

      86400            ; refresh, seconds
      7200            ; retry, seconds
      3600000            ; expire, seconds
      86400 )            ; minimum, seconds


The location of the files is in "/var/named"
The filename will end with ".db" eg: domainname.com.db"

Appreciates if anybody can help me on this.


P/S : the reason i need to replace the "600" in my STEP 1 is to replace the string that are not specific above.


Thank you,

Regards,
Sham
; cPanel 11.18.1-CURRENT_21558

; Zone file for domainname.com

$TTL 600

@      600      IN      SOA     dns60.hostingcompany.com. report.hostingcompany.com. (

                2008041401      ; serial, todays date+todays

                600             ; refresh, seconds

                600             ; retry, seconds

                600             ; expire, seconds

                600 )           ; minimum, seconds
 

domainname.com. 600 IN NS dns60.hostingcompany.com.

domainname.com. 600 IN NS dns61.hostingcompany.com.
 

domainname.com. IN A 124.217.243.160
 

localhost.domainnamecom. IN A 127.0.0.1
 

domainname.com. IN MX 0 domainname.com.
 

mail IN CNAME domainname.com.

www IN CNAME domainname.com.

ftp IN CNAME domainname.com.

Open in new window

0
Comment
Question by:smksa
  • 5
  • 5
10 Comments
 
LVL 48

Expert Comment

by:Tintin
ID: 22828670

#!/bin/bash

for db in $(find /var/named -name "*.db)

do

  sed -i.bak -e "s/600.*refresh, seconds/86400    ;refresh, seconds/" \

    -e "s/600.*retry, seconds/7200      ;retry, seconds/" \

    -e "s/600.*expire, seconds/3600000  ;expire, seconds/" \

    -e "s/600.*minimum, seconds/86400   ;expire, seconds/" $db

done

Open in new window

0
 
LVL 2

Author Comment

by:smksa
ID: 22828688
Hi,

Thanks TinTin,

But how about my Step 1 in which i would like all string of 600 to be changed to 14400 first before the specific string as you given above.

Thank you,

Regards,
Sham
0
 
LVL 48

Accepted Solution

by:
Tintin earned 500 total points
ID: 22828721
What's the purpose of Step 1?  Do you want to end up with

@TTL 14440
domainname.com. 14400 IN NS dns60.hostingcompany.com.
domainname.com. 14400 IN NS dns61.hostingcompany.com.

if so, then change the script to



#!/bin/bash

for db in $(find /var/named -name "*.db)

do

  sed -i.bak -e "s/600/14400/" \

    -e "s/14400.*refresh, seconds/86400    ;refresh, seconds/" \

    -e "s/14400.*retry, seconds/7200      ;retry, seconds/" \

    -e "s/14400.*expire, seconds/3600000  ;expire, seconds/" \

    -e "s/14400.*minimum, seconds/86400   ;expire, seconds/" $db

done

Open in new window

0
 
LVL 2

Author Comment

by:smksa
ID: 22828749
Hi TinTin,

Thanks ...

But i received the following error message :

root@svr8 [/]# ./changettl.sh
./changettl.sh: line 8: unexpected EOF while looking for matching `"'
./changettl.sh: line 10: syntax error: unexpected end of file
0
 
LVL 48

Expert Comment

by:Tintin
ID: 22828763
if you got those errors, you must have copy/pasted the script I gave you incorrectly.

Please check again, or copy/paste the version you are using here.
0
Enterprise Mobility and BYOD For Dummies

Like “For Dummies” books, you can read this in whatever order you choose and learn about mobility and BYOD; and how to put a competitive mobile infrastructure in place. Developed for SMBs and large enterprises alike, you will find helpful use cases, planning, and implementation.

 
LVL 2

Author Comment

by:smksa
ID: 22828777
Hi,

Attached is the exact copy of the script ...

Can you help to check where went wrong ?

Thanks..
#!/bin/bash

for db in $(find /var/named -name "*.db)

do

  sed -i.bak -e "s/600/14400/" \

    -e "s/14400.*refresh, seconds/86400    ;refresh, seconds/" \

    -e "s/14400.*retry, seconds/7200      ;retry, seconds/" \

    -e "s/14400.*expire, seconds/3600000  ;expire, seconds/" \

    -e "s/14400.*minimum, seconds/86400   ;expire, seconds/" $db

done

Open in new window

0
 
LVL 48

Expert Comment

by:Tintin
ID: 22828834
Sorry, my mistake

for db in $(find /var/named -name "*.db)

should be

for db in $(find /var/named -name "*.db")
0
 
LVL 2

Author Comment

by:smksa
ID: 22828900
Hi,

It seems there are a mistake in the scripts...

FYI, the last part "86400   ;expire, seconds" should be "86400   ) ;minimum, seconds"

you missed the ")" ,

I have runned the script but not yet restart the dns ...

May i know how to move all .db.bak file back to .db ?

Thank you.

Regards,
Sham.



0
 
LVL 48

Expert Comment

by:Tintin
ID: 22828973
To revert all .bak files, do


for db in $(find /var/named -name "*.bak")

do

  mv $db ${db%%.bak}

done

Open in new window

0
 
LVL 2

Author Closing Comment

by:smksa
ID: 31511054
Thanks for helping
0

Featured Post

Efficient way to get backups off site to Azure

This user guide provides instructions on how to deploy and configure both a StoneFly Scale Out NAS Enterprise Cloud Drive virtual machine and Veeam Cloud Connect in the Microsoft Azure Cloud.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

rdate is a Linux command and the network time protocol for immediate date and time setup from another machine. The clocks are synchronized by entering rdate with the -s switch (command without switch just checks the time but does not set anything). …
I. Introduction There's an interesting discussion going on now in an Experts Exchange Group — Attachments with no extension (http://www.experts-exchange.com/discussions/210281/Attachments-with-no-extension.html). This reminded me of questions tha…
Learn how to find files with the shell using the find and locate commands. Use locate to find a needle in a haystack.: With locate, check if the file still exists.: Use find to get the actual location of the file.:
Get a first impression of how PRTG looks and learn how it works.   This video is a short introduction to PRTG, as an initial overview or as a quick start for new PRTG users.

920 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

14 Experts available now in Live!

Get 1:1 Help Now