文章由来:前段有问我如何修改主机名,今天又有人问。
何为sed:sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。以下介绍的是Gnu版本的Sed 3.02。
查看脚本文件nhN.sh(将以下内容保存为nhN.sh)
cat nhN.sh
#!/bin/bash # 说明:修改Liunx系统主机名。在Centos、rh5试验过 # 使用方法:sh nhN.sh kinggoo ###意思是修改新主机名为kinggoo # 缺点:在处理hosts文件的时候我觉得跟我想要的还是不太一样 # 知识点:sed的 t/T这东西挺不错,跟if语句一样效果 # $1:The new host name oldname="`hostname`" hostname "$1" HOSTNAME=`hostname` Network="/etc/sysconfig/network" Hosts="/etc/hosts" sed -r -i 's/^HOSTNAME='${oldname}'.*$/HOSTNAME='`hostname`'/g' ${Network} sed -r -i 's/'${oldname}'/\ '`hostname`'\ /g;t;s/$/&\ '`hostname`'/g' ${Hosts} echo -e "hostname:{`hostname`}\n Setting up hosts file:\n{\n`cat ${Hosts}`\n}\n Setting up network file:\n{\n`cat ${Network}`\n}\n HOSTNAME:\n{\n`echo ${HOSTNAME}`\n}\n" echo -e "完成,请查看以上修改信息是否正确\n\r如无误,请重启生效!"
参考资料:
t label
if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
T label
错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
下载脚本:百度网盘
- THE END -
4.6 批量修改主机名
备注:通用脚本,可以输入任何命令,expect免密码登录执行
[root@kickstart expects]# cat expect_ssh_command.exp
#!/usr/bin/expect
#Author:yvonne
#Date:2015-9-17 15:33:46。
#E-mail:hxy_lanzhi@163.com
#Function:Batch scp optimize_system.sh and hosts to other 17 servers.
if { $argc != 2 } {
send_user “usage: expect expect_ssh_command.exp host command\n”
exit
}
#define var
set host [lindex $argv 0]
set command [lindex $argv 1]
set password “123456”
spawn ssh -p22 root@$host $command
set timeout 60
expect {
-timeout 2
“yes/no” {send “yes\r”;exp_continue}
“*password” {send “$password\r”}
timeout {puts “expect connect timeout,pls contact Yvonne.”; return}
}
expect eof
exit -onexit {
send_user “Yvonne say good bye to you!\n”
}
#script usage
#expect expect_ssh_command.exp $host $command
#example
#ssh -p22 root@192.168.107.130 /bin/hostname test
[root@kickstart expects]#
执行命令参考:
expect expect_ssh_command.exp 192.168.107.130 “/bin/hostname mysql-master”
expect expect_ssh_command.exp 192.168.107.130 “sed -i ‘s/HOSTNAME=CentOS6/HOSTNAME=mysql-master/g’ /etc/sysconfig/network”
谢谢 不错
sed -i ‘/httpd-vhosts/s/^#//’ httpd.conf
以 httpd-vhosts 为关键字找到这行,并将前面的第一个字符删掉,即将#删掉。
sed的一个简单用法:
eg:在某一个文件中的一个aaa字段前后添加某些字段.
在aaa前面添加字段:sed -ne ”s/aaa/&HELLO/p” test
输出结果:aaaHELLO
在aaa后面添加字段:sed -ne ”s/aaa/HELLO&/p” test
输出结果:HELLOaaa
在前后同时添加:sed -ne ”s/aaa/&HELLO&/p” test
输出结果:aaaHELLOaaa
后续补充:
1.在某个字段前添加内容:
sed -n ”s/apache/&HELLO/p” /etc/passwd
输出结果:apacheHELLO:x:48:48:Apache:/var/www:/sbin/nologin
2.删除文件第一个字符:
sed ”s/^.//” /etc/passwd
3.删除文件第二个字符:
sed -r ”s/^(.)./1/” /etc/passwd
或:sed ”s/^(.)./1/” /etc/passwd
4.删除文件一个字符:
sed ”s/.$//” /etc/passwd
5.删除文件每行的倒数第二个字符
sed ”s/.(.)$/1/” /etc/passwd
或:sed -r ”s/.(.)$/1/” /etc/passwd
6.删除文件每行的第二个单词
sed -r ”s/^([a-Z] [^a-Z] )[a-Z] /1/” /etc/passwd
7.删除文件每行的倒数第二个单词
sed -r ”s/[a-Z] ([^a-Z] [a-Z] )$/1/” /etc/passwd
8.删除一个文件中所有的数字
sed ”s/[0-9]//g” test
9.删除每行开头的所有空格
sed ”s/^[ ]//g” test
10.用制表符替换文件中出现的所有空格
sed -r ”s/[ ] /t/g” test
11.把所有大写字母用()括起来
sed -r ”s/( [A-Z])/(1)/g” test
12.隔行删除
sed -n ”1~2p” test
13.把文件从第1行到第3行复制到第4行后面
sed -e ”1h” -e ”2,3H” -e ”4G” test
sed -i ‘/type:/s/out,//;t;s/,out//’ 11.sh
删除类是type:后面的的一些字符
sed -i “s/\(type:\).*$/\1/” 11.sh
就是替换\(type:\).*$为type: