Linux 脚本编写 如何编写一个脚本,修改已有文件中的内容

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux 脚本编写 如何编写一个脚本,修改已有文件中的内容相关的知识,希望对你有一定的参考价值。

如何编写一个脚本,修改已有文件中的内容

例如 /etc/resolv.conf 这个文件 里面的内容是nameserver 192.168.10.1 用来搜索域名
如果要写一个脚本怎样才能只修改IP

我试着用echo来写,但不是追加就是覆盖了
#!/bin/bash
echo 'nameserver 192.168.10.2' > /etc/resovl.conf

这样来写就全部改掉了,如果文件内容较多,但只想该其中的某些地方, 该如何写,请高手指教,不胜感激!!!!

就以DNS的数据库文件为例 /var/named 中的honey.com.zone (文件名随便起的)

$TTL 86400
@ IN SOA honey.com. root.honey.com.(
42 ; serial (d.adams)
3H ; refresh
1W ; retry
) ; monimum
@ IN NS nsl.honey.com.
www IN A 192.168.1.7

修改为
@ IN NS nsl.ashaur.com.
www IN A 192.168.1.6

实现的方法如下:

1、第一步,打开命令控制台以找到要编辑的文件,执行命令ls来查看下面的一些文件,在下面有一个index.php文件,如下图所示。

2、其次,完成上述步骤后,执行命令vi
 index.php,如下图所示。

3、接着,完成上述步骤后,如果要修改此文件的内容,请按键盘上的“
 i”键,底部将变为INSERT,就可以对其进行修改,如下图所示。

4、然后,写echo的代码保存 Esc+:+wq,这是保存,按Enter键保存,如下图所示。

5、随后,完成上述步骤后,再次打开文件,将发现刚刚编写的代码已保存在其中,如下图所示。

6、最后,不保存命令是Esc+:+q!,可以灵活运用这些命令。可以使用上述步骤在Linux终端中使用命令来编辑和保存文件,如下图所示。这样,问题就解决了。

参考技术A 说明:将以下脚本拷贝到vi中,保存,修改权限执行,得到你想要的结果。

#!/bin/bash
cd /etc/named
cp honey.com.zone /tmp/honey.com.zone.bk
awk '/^@ IN NS nsl.honey.com./ print "@ IN NS nsl.ashaur.com";next \
/^www IN A 192.168.1.7/ print "www IN A 192.168.1.6";next \
print' honey.com.zone >/tmp/honey.com.zone.tmp
cp /tmp/honey.com.zone.tmp /etc/named/honey.com.zone追问

有种写法是这样的 sed -i 's#修改前#修改后#' 文件名 这个命令不知道您会用不? 如果使用这个命令的话,应该怎么写??非常感谢

追答

用awk可以一次匹配多个项目,一次性就可以修改完成了。
用sed一次只能修改一个,要是一个文件里面有多个要修改就显示不那么实用哈。

本回答被提问者采纳
参考技术B echo $1
sed "s/[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+/$1/" test.data

test.data 就是你的文件。用正则表达式匹配到ip地址,然后用命令行的输入替换。
不过问题是如果文件中有多个,还是挺麻烦的。还是用强大的脚本比较好。

另外,替换后还要通过临时文件替换回原文件。不能直接覆盖
参考技术C 首先你得知道什么是脚本,linux脚本编写很简单,只要遵循循序渐进的步奏来写就OK了,比如说你要写一个系统更新和安装语言编译的脚本,如下:
#!/bin/bash

####---- global variables ----begin####
echo "will be installed, wait ..."
sed -i "s;alias cp;#alias cp;" ~/.bashrc
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
yum install ntpdate -y
/usr/sbin/ntpdate asia.pool.ntp.org >> /var/log/ntpdate.log
setenforce 0
service iptables stop
chkconfig iptables off
yum update -y
yum install gcc gcc-c++ libxml2-devel ncurses-devel openssl-devel make telnet vixie-cron autoconf gd gd-devel ntpdate wget pcre-devel python-devel python-setuptools libzip libzip-devel libjpeg* freetype* -y
easy_install pip
echo "Congratulations, the installation is over"
参考技术D 首先你得知道什么是脚本,linux脚本编写很简单,只要遵循循序渐进的步奏来写就OK了,比如说你要写一个系统更新和安装语言编译的脚本,如下:
#!/bin/bash

####---- global variables ----begin####
echo "will be installed, wait ..."
sed -i "s;alias cp;#alias cp;" ~/.bashrc
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
yum install ntpdate -y
/usr/sbin/ntpdate asia.pool.ntp.org >> /var/log/ntpdate.log
setenforce 0
service iptables stop
chkconfig iptables off
yum update -y
yum install gcc gcc-c++ libxml2-devel ncurses-devel openssl-devel make telnet vixie-cron autoconf gd gd-devel ntpdate wget pcre-devel python-devel python-setuptools libzip libzip-devel libjpeg* freetype* -y
easy_install pip
echo "Congratulations, the installation is over"

编写linux脚本根据文档中的内容(文件名)查找文件

linux去vsftpd服务器下载指定的文件,这些需要的文件的文件名都在一个文档中,怎样把文件名提取出来,并根据文件名去服务器下载
文档是xml个格式的,每次读一个文件名(占一行),ftp下载,下载完成后删除xml文件中的这个文件名,xml文件中的文件名可能随时会增加,要求这个脚本在后台一直运行,有文件名就下载

1,你存文件名的文档内容格式是什么样的,根据格式考虑是否使用sed,awk来进行编辑后提取。
2.假设你的文件名提取出来后,可以通过两种方式代入到脚本中,第一种就是把文件名存成一个
数组,依次读取数组元素,第二种把整理出来的文件名存成一个文本文件,假设整理后的结果
为每一个文件名为一行,然后在脚本中调用逐行读取这个文本文件内容。追问

是xml个格式的,每次读一个文件名(占一行),ftp下载,下载完成后删除xml文件中的这个文件名,xml文件中的文件名可能随时会增加,要求这个脚本在后台一直运行,有文件名就下载

追答

那就是从xml里提取文件名,存成数组或者文件。
而且xml文件有多大,提取的文件名有多少。是否会影响到服务器的性能。而且你的需求
还需要在下载完成后,删除xml内容。这个估计你的好好思考一下了。
你这种脚本,就得在实际环境中写,外人只能给你提建议。。直接给你一个完整的脚本。
不太可能。

追问

1 #!/bin/bash
2 filelist="filename"
3 declare -i number
4 while [ 1 ]
5 do
6 downfile=`head -1 $filelist`??
7 number=`cat $filelist | wc -l` ??

8 if [ number -gt 0 ];then
9 ftp -n<<!
10 open 192.168.1.106
11 user user 123
12 binary
13 prompt
14 get $downfile
15 close
16 bye
17 !
18 sed -i '1d' $filelist
19 fi
20 done
用text试验一下,帮我看看 ,有问号的地方出问题了

追答

你那两个只是提取一下变量,从语法上我没看出来有什么问题。具体报什么错贴一下。
我觉得你最好downfile变量赋值这句可以放到if里,逻辑上也就是当number大于0时执行then,
因为你只有在大于0时才可以截取到downfile这个变量。不大于0时或截取不到时就为空。
而且你if判断写错了。 if [ $number -gt 0 ];then 你最好sh -x scriptname 自己检测一下。

追问

找到一个错误,8行没有加$
另外一个问题是服务器有一个test文件,下载下来会变为test?,所有的文件下载后,名字后都有?
这是怎么回事啊!是第六行有错误啊,

追答

那就不晓得了。估计跟字符集有关。猜的。因为我没遇见过。

追问

我怀疑提取文件名有错

我试了一下,如果我只写一行,也就是一个文件名,就没有?,但多个就有错误,即使下载后删除到只剩一行,最后一个文件名也有?

参考技术A cat filelist|while read i
do
ftp -n ftpserverip <<end
username
passwd
get $i
end
done

差不多就是这么个意思,,有些地方可能写的有些出入,我这也没有没ftp 的服务器了,,,只是凭着印象写的

以上是关于Linux 脚本编写 如何编写一个脚本,修改已有文件中的内容的主要内容,如果未能解决你的问题,请参考以下文章

Linux中编写一个shell脚本将指定目录中的文件的文件全名改为大写,但是命令执行完,shell

#yyds干货盘点# web安全day36:Linux脚本编写自动修改IP地址

linux下编写一个shell脚本,实现自动安装软件

Linux—编写shell脚本操作数据库执行sql

如何编写一个shell脚本

shell编程中,如何将编写的脚本把其脚本名当做shell命令来使用