Solved

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

Posted on 2008-10-28
10
279 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
Windows Server 2016: All you need to know

Learn about Hyper-V features that increase functionality and usability of Microsoft Windows Server 2016. Also, throughout this eBook, you’ll find some basic PowerShell examples that will help you leverage the scripts in your environments!

 
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
 
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

Microsoft Certification Exam 74-409

Veeam® is happy to provide the Microsoft community with a study guide prepared by MVP and MCT, Orin Thomas. This guide will take you through each of the exam objectives, helping you to prepare for and pass the examination.

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
expectj telnet failing 5 36
VPS for routing recomendations 3 50
AWS Central Authentication 1 59
maybe no no httpd.conf 6 47
How many times have you wanted to quickly do the same thing to a list but found yourself typing it again and again? I first figured out a small time saver with the up arrow to recall the last command but that can only get you so far if you have a bi…
Note: for this to work properly you need to use a Cross-Over network cable. 1. Connect both servers S1 and S2 on the second network slots respectively. Note that you can use the 1st slots but usually these would be occupied by the Service Provide…
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.:
This demo shows you how to set up the containerized NetScaler CPX with NetScaler Management and Analytics System in a non-routable Mesos/Marathon environment for use with Micro-Services applications.

770 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