shell programming (six)

A, sed introduces
1.sed to Zuosha?
How 2.sed handle files?
Two, sed using the method described
. Command Format
1) syntax
2) illustrates
2. script format
1) Usage
2) Note
3) illustrate
3. Supplement expansion summarize
three classroom exercises
Fourth, after-school combat

A, sed introduction

1. sed to Zuosha?

is an abbreviation sed Stream Editor (stream editor), acronym stream editor; == processing for the file ==.

2. sed how to handle files?

sed is read line by line == == == content file and perform processing == == == accordance with the requirements, the result of the processed output to the screen == ==.

and

  1. First sed to read single line in the file, save it to a temporary buffer zone == == (also called the pattern space)
  2. Then == temporary buffer line, after the completion of the transmission line to the screen needs == == == processing according to

to sum up:

  1. Due to the presence of each row sed to a temporary buffer, this copy editing, it does not directly modify the original file == ==
  2. Sed is mainly used to automatically edit one or more documents; documents to simplify the repeated operation, the file conversion and filtering operations

Two, sed using the method described

sed a common syntax, there are two, one called == == command-line mode, another script called == == mode.

1. command line format

1) syntax

Sed [Options] == ' == processing operation == == filename

  • Common options
Options Explanation Remark
-e Make multiple (multiple) edited
==-n== Cancel the default output Does not automatically print the pattern space
==-r== Extended regular expressions == ==
==-i== Place editing (modify the source file)
-f Sed script to specify the file name
  • == == common processing operation

Ugly words in front : all of the following actions == == should be in single quotes , the

action Explanation Remark
'p' print
'i' Prior to the specified line == == Inserts Similar vim in uppercase O
'a' After the specified line == == Inserts Similar vim in lowercase o
'c' Replace all the contents of the specified line
'd' Delete the specified row

2) illustrates

  • Document preparation
# vim a.txt 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
298374837483
172.16.0.254
10.1.1.1

① the file == add, delete, change, search == operator

Syntax: sed option == '== positioning command + == == file handle.

1) Print the file contents
[root@server ~]# sed ''  a.txt                      对文件什么都不做
[root@server ~]# sed -n 'p'  a.txt                  打印每一行,并取消默认输出
[root@server ~]# sed -n '1p'  a.txt                 打印第1行
[root@server ~]# sed -n '2p'  a.txt                 打印第2行
[root@server ~]# sed -n '1,5p'  a.txt               打印1到5行
[root@server ~]# sed -n '$p' a.txt                  打印最后1行
2) adding file content

Insert positioned above the address i

inserted under a

[root@server ~]# sed '$a99999' a.txt                文件最后一行下面增加内容
[root@server ~]# sed 'a99999' a.txt                 文件每行下面增加内容
[root@server ~]# sed '5a99999' a.txt                文件第5行下面增加内容
[root@server ~]# sed '$i99999' a.txt                文件最后一行上一行增加内容
[root@server ~]# sed 'i99999' a.txt                 文件每行上一行增加内容
[root@server ~]# sed '6i99999' a.txt                文件第6行上一行增加内容
[root@server ~]# sed '/^uucp/ihello'                以uucp开头行的上一行插入内容
3) modify the contents of the file

c replacing the entire line == == specified content

[root@server ~]# sed '5chello world' a.txt      替换文件第5行内容
[root@server ~]# sed 'chello world' a.txt       替换文件所有内容
[root@server ~]# sed '1,5chello world' a.txt    替换文件1到5号内容为hello world
[root@server ~]# sed '/^user01/c888888' a.txt   替换以user01开头的行
4) delete the contents of the file
[root@server ~]# sed '1d' a.txt                         删除文件第1行
[root@server ~]# sed '1,5d' a.txt                   删除文件1到5行
[root@server ~]# sed '$d' a.txt                     删除文件最后一行

② == the file search and replace operations ==

Syntax: sed option 'contents == s / search / replace / action ==' document to be processed

Wherein, == S == showing search Searching; slash == / == representing the separator, can define; == printing operation is typically P == == global replacement of G ==

[root@server ~]# sed -n 's/root/ROOT/p' 1.txt 
[root@server ~]# sed -n 's/root/ROOT/gp' 1.txt 
[root@server ~]# sed -n 's/^#//gp' 1.txt 
[root@server ~]# sed -n 's@/sbin/nologin@itcast@gp' a.txt
[root@server ~]# sed -n 's/\/sbin\/nologin/itcast/gp' a.txt
[root@server ~]# sed -n '10s#/sbin/nologin#itcast#p' a.txt 
uucp:x:10:14:uucp:/var/spool/uucp:itcast
[root@server ~]# sed -n 's@/sbin/nologin@itcastheima@p' 2.txt 
注意:搜索替换中的分隔符可以自己指定

[root@server ~]# sed -n '1,5s/^/#/p' a.txt      注释掉文件的1-5行内容
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

③ other commands

command Explanation Remark
r Read the contents from another file
w Save as content
& Find a string in order to save the references in the replacement string the same as
= Print line numbers
All command-line application other than the selected row, and then put the number of rows '1,5!'
q drop out

for example:

r   从文件中读取输入行
w   将所选的行写入文件
[root@server ~]# sed '3r /etc/hosts' 2.txt 
[root@server ~]# sed '$r /etc/hosts' 2.txt
[root@server ~]# sed '/root/w a.txt' 2.txt 
[root@server ~]# sed '/[0-9]{4}/w a.txt' 2.txt
[root@server ~]# sed  -r '/([0-9]{1,3}\.){3}[0-9]{1,3}/w b.txt' 2.txt

!   对所选行以外的所有行应用命令,放到行数之后
[root@server ~]# sed -n '1!p' 1.txt 
[root@server ~]# sed -n '4p' 1.txt 
[root@server ~]# sed -n '4!p' 1.txt 
[root@server ~]# cat -n 1.txt 
[root@server ~]# sed -n '1,17p' 1.txt 
[root@server ~]# sed -n '1,17!p' 1.txt 

&   保存查找串以便在替换串中引用   \(\)

[root@server ~]# sed -n '/root/p' a.txt 
root:x:0:0:root:/root:/bin/bash
[root@server ~]# sed -n 's/root/#&/p' a.txt 
#root:x:0:0:root:/root:/bin/bash

# sed -n 's/^root/#&/p' passwd   注释掉以root开头的行
# sed -n -r 's/^root|^stu/#&/p' /etc/passwd 注释掉以root开头或者以stu开头的行
# sed -n '1,5s/^[a-z].*/#&/p' passwd  注释掉1~5行中以任意小写字母开头的行
# sed -n '1,5s/^/#/p' /etc/passwd  注释1~5行
或者
sed -n '1,5s/^/#/p' passwd 以空开头的加上#
sed -n '1,5s/^#//p' passwd 以#开头的替换成空

[root@server ~]# sed -n '/^root/p' 1.txt 
[root@server ~]# sed -n 's/^root/#&/p' 1.txt 
[root@server ~]# sed -n 's/\(^root\)/#\1/p' 1.txt 
[root@server ~]# sed -nr '/^root|^stu/p' 1.txt 
[root@server ~]# sed -nr 's/^root|^stu/#&/p' 1.txt 

=   打印行号
# sed -n '/bash$/=' passwd    打印以bash结尾的行的行号
# sed -ne '/root/=' -ne '/root/p' passwd 
# sed -n '/nologin$/=;/nologin$/p' 1.txt
# sed -ne '/nologin$/=' -ne '/nologin$/p' 1.txt

q   退出
# sed '5q' 1.txt
# sed '/mail/q' 1.txt
# sed -r '/^yunwei|^mail/q' 1.txt
[root@server ~]# sed -n '/bash$/p;10q' 1.txt
ROOT:x:0:0:root:/root:/bin/bash

综合运用:
[root@server ~]# sed -n '1,5s/^/#&/p' 1.txt 
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

[root@server ~]# sed -n '1,5s/\(^\)/#\1/p' 1.txt 
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
#adm:x:3:4:adm:/var/adm:/sbin/nologin
#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

④ other options

-e 多项编辑
-r  扩展正则
-i 修改原文件

[root@server ~]# sed -ne '/root/p' 1.txt -ne '/root/='
root:x:0:0:root:/root:/bin/bash
1
[root@server ~]# sed -ne '/root/=' -ne '/root/p' 1.txt 
1
root:x:0:0:root:/root:/bin/bash

在1.txt文件中的第5行的前面插入“hello world”;在1.txt文件的第8行下面插入“哈哈哈哈”

[root@server ~]# sed -e '5ihello world' -e '8a哈哈哈哈哈' 1.txt  -e '5=;8='

sed -n '1,5p' 1.txt
sed -ne '1p' -ne '5p' 1.txt
sed -ne '1p;5p' 1.txt

过滤vsftpd.conf文件中以#开头和空行:
[root@server ~]# grep -Ev '^#|^$' /etc/vsftpd/vsftpd.conf
[root@server ~]# sed -e '/^#/d' -e '/^$/d' /etc/vsftpd/vsftpd.conf
[root@server ~]# sed '/^#/d;/^$/d' /etc/vsftpd/vsftpd.conf
[root@server ~]# sed -r '/^#|^$/d' /etc/vsftpd/vsftpd.conf

过滤smb.conf文件中生效的行:
# sed -e '/^#/d' -e '/^;/d' -e '/^$/d' -e '/^\t$/d' -e '/^\t#/d' smb.conf
# sed -r '/^(#|$|;|\t#|\t$)/d' smb.conf 

# sed -e '/^#/d' -e '/^;/d' -e '/^$/d' -e '/^\t$/d' -e '/^\t#/' smb.conf

[root@server ~]# grep '^[^a-z]' 1.txt

[root@server ~]# sed -n '/^[^a-z]/p' 1.txt

过滤出文件中的IP地址:
[root@server ~]# grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}' 1.txt 
192.168.0.254
[root@server ~]# sed -nr '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' 1.txt 
192.168.0.254

[root@server ~]# grep -o -E '([0-9]{1,3}\.){3}[0-9]{1,3}' 2.txt 
10.1.1.1
10.1.1.255
255.255.255.0

[root@server ~]# sed -nr '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' 2.txt
10.1.1.1
10.1.1.255
255.255.255.0
过滤出ifcfg-eth0文件中的IP、子网掩码、广播地址
[root@server shell06]# grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' ifcfg-eth0 
10.1.1.1
255.255.255.0
10.1.1.254
[root@server shell06]# sed -nr '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' ifcfg-eth0|cut -d'=' -f2
10.1.1.1
255.255.255.0
10.1.1.254
[root@server shell06]# sed -nr '/([0-9]{1,3}\.){3}[0-9]{1,3}/p' ifcfg-eth0|sed -n 's/[A-Z=]//gp'
10.1.1.1
255.255.255.0
10.1.1.254

[root@server shell06]# ifconfig eth0|sed -n '2p'|sed -n 's/[:a-Z]//gp'|sed -n 's/ /\n/gp'|sed '/^$/d'
10.1.1.1
10.1.1.255
255.255.255.0
[root@server shell06]# ifconfig | sed -nr '/([0-9]{1,3}\.)[0-9]{1,3}/p' | head -1|sed -r 's/([a-z:]|[A-Z/t])//g'|sed 's/ /\n/g'|sed  '/^$/d'

[root@server shell06]# ifconfig eth0|sed -n '2p'|sed -n 's/.*addr:\(.*\) Bcast:\(.*\) Mask:\(.*\)/\1\n\2\n\3/p'
10.1.1.1 
10.1.1.255 
255.255.255.0

-i 选项  直接修改原文件
# sed -i 's/root/ROOT/;s/stu/STU/' 11.txt
# sed -i '17{s/YUNWEI/yunwei/;s#/bin/bash#/sbin/nologin#}' 1.txt
# sed -i '1,5s/^/#&/' a.txt
注意:
-ni  不要一起使用
p命令 不要再使用-i时使用

⑤ == sed in conjunction with regular use ==

sed option == 'command == == == sed or regular expressions == == == address or locate ==== == filename

  1. Addressing is used to determine which rows to edit. The address may be a digital form, a regular expression, or a combination of both.
  2. If the address is not specified, sed will process all the input file lines.
Regular Explanation Remark
/key/ Line contains the keyword query sed -n '/root/p' 1.txt
/key1/,/key2/ It includes matching rows between the two keywords sed -n '/\^adm/,/^mysql/p' 1.txt
/key/,x From the beginning of the line to match keyword == file first row between rows x == (that contain the keyword row) sed -n '/^ftp/,7p'
x,/key/ The first line of the file x from the start line between the keyword and the matched line
x, y! Line x to y is not included
/key/! Not including the word of sed -n '/bash$/!p' 1.txt

2. script format

1) Usage

# sed -f scripts.sh  file       //使用脚本处理文件
建议使用   ./sed.sh   file

脚本的第一行写上
#!/bin/sed -f
1,5d
s/root/hello/g
3i777
5i888
a999
p

2) Notes

1) 脚本文件是一个sed的命令行清单。'commands'
2) 在每行的末尾不能有任何空格、制表符(tab)或其它文本。
3) 如果在一行中有多个命令,应该用分号分隔。
4) 不需要且不可用引号保护命令
5) #号开头的行为注释

3) illustrates

# cat passwd
stu3:x:509:512::/home/user3:/bin/bash
stu4:x:510:513::/home/user4:/bin/bash
stu5:x:511:514::/home/user5:/bin/bash

# cat sed.sh 
#!/bin/sed -f
2a\
******************
2,$s/stu/user/
$a\
we inster new line
s/^[a-z].*/#&/

[root@server ~]# cat 1.sed 
#!/bin/sed -f
3a**********************
$chelloworld
1,3s/^/#&/

[root@server ~]# sed -f 1.sed -i 11.txt 
[root@server ~]# cat 11.txt 
#root:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#daemon:x:2:2:daemon:/sbin:/sbin/nologin
**********************
adm:x:3:4:adm:/var/adm:/sbin/nologin
helloworld

3. Supplement extended summary

1、正则表达式必须以”/“前后规范间隔
例如:sed '/root/d' file
例如:sed '/^root/d' file

2、如果匹配的是扩展正则表达式,需要使用-r选来扩展sed
grep -E
sed -r
+ ? () {n,m} | \d

注意:         
在正则表达式中如果出现特殊字符(^$.*/[]),需要以前导 "\" 号做转义
eg:sed '/\$foo/p' file

3、逗号分隔符
例如:sed '5,7d' file                  删除5到7行
例如:sed '/root/,/ftp/d' file 
删除第一个匹配字符串"root"到第一个匹配字符串"ftp"的所有行本行不找 循环执行

4、组合方式
例如:sed '1,/foo/d' file          删除第一行到第一个匹配字符串"foo"的所有行
例如:sed '/foo/,+4d' file         删除从匹配字符串”foo“开始到其后四行为止的行
例如:sed '/foo/,~3d' file         删除从匹配字符串”foo“开始删除到3的倍数行(文件中)
例如:sed '1~5d' file              从第一行开始删每五行删除一行
例如:sed -nr '/foo|bar/p' file    显示配置字符串"foo"或"bar"的行
例如:sed -n '/foo/,/bar/p' file   显示匹配从foo到bar的行
例如:sed '1~2d'  file             删除奇数行
例如:sed '0-2d'   file                删除偶数行 sed '1~2!d'  file

5、特殊情况
例如:sed '$d' file                    删除最后一行
例如:sed '1d' file                    删除第一行

6、其他:
sed 's/.//' a.txt                       删除每一行中的第一个字符
sed 's/.//2' a.txt                  删除每一行中的第二个字符
sed 's/.//N' a.txt                  从文件中第N行开始,删除每行中第N个字符(N>2)
sed 's/.$//' a.txt                  删除每一行中的最后一个字符

[root@server ~]# cat 2.txt 
1 a
2 b
3 c
4 d
5 e
6 f
7 u
8 k
9 o
[root@server ~]# sed '/c/,~2d' 2.txt 
1 a
2 b
5 e
6 f
7 u
8 k
9 o

Third, classroom exercises

  1. The arbitrary number replaced with a null or tabs
  2. Digital line 1-5 remove file, colon slash
  3. Keyword matching root replace hello itcast, and save it to a file test.txt
  4. Delete vsftpd.conf, smb.conf, main.cf configuration file for all line comments and blank lines (not directly modify the original file)
  5. Use sed command interceptor own ip address
  6. Sed command taken using a disposable ip address, broadcast address, netmask
  7. File and comment out the line 2-3 match to the line beginning with root or beginning with the ftp

1、将文件中任意数字替换成空或者制表符
2、去掉文件1-5行中的数字、冒号、斜杠
3、匹配root关键字的行替换成hello itcast,并保存到test.txt文件中
4、删除vsftpd.conf、smb.conf、main.cf配置文件里所有注释的行及空行(不要直接修改原文件)
5、使用sed命令截取自己的ip地址
# ifconfig eth0|sed -n '2p'|sed -n 's/.*addr://pg'|sed -n 's/Bcast.*//gp'
10.1.1.1  
# ifconfig eth0|sed -n '2p'|sed 's/.*addr://g'|sed 's/ Bcast:.*//g'
6、使用sed命令一次性截取ip地址、广播地址、子网掩码
# ifconfig eth0|sed -n '2p'|sed -n 's#.*addr:\(.*\) Bcast:\(.*\) Mask:\(.*\)#\1\n\2\n\3#p'
10.1.1.1 
10.1.1.255 
255.255.255.0

7、注释掉文件的2-3行和匹配到以root开头或者以ftp开头的行
# sed -nr '2,3s/^/#&/p;s/^ROOT|^ftp/#&/p' 1.txt
#ROOT:x:0:0:root:/root:/bin/bash
#bin:x:1:1:bin:/bin:/sbin/nologin
#3daemon:x:2:2:daemon:/sbin:/sbin/nologin

# sed -ne '1,2s/^/#&/gp' a.txt -nre 's/^lp|^mail/#&/gp'
# sed -nr '1,2s/^/#&/gp;s/^lp|^mail/#&/gp' a.txt

Fourth, after-school combat

1, write a system initialization script
1) automatically modifies the host name (such as: ip is 192.168.0.88, the host name to server88.itcast.cc)

a. Change the file non-interactive sed

/etc/sysconfig/network

. B The IP host according to the present interception IP assignment to a variable; then re-assigned to the last variable in another variable IP1 to IP segmentation.

2) automatic configuration available source yum

3) automatically turn off the firewall and selinux

2, write a script to set up the ftp service requirements are as follows:
1) does not support local user login = NO local_enable
2) delete anonymous users can upload new anon_mkdir_write_enable = YES YES = anon_upload_enable
3) anonymous user speed limit 500KBps anon_max_rate = 500000

仅供参考:
#!/bin/bash
ipaddr=`ifconfig eth0|sed -n '2p'|sed -e 's/.*inet addr:\(.*\) Bcast.*/\1/g'`
iptail=`echo $ipaddr|cut -d'.' -f4`
ipremote=192.168.1.10
#修改主机名
hostname server$iptail.itcast.com
sed -i "/HOSTNAME/cHOSTNAME=server$iptail.itcast.com" /etc/sysconfig/network
echo "$ipaddr server$iptail.itcast.cc" >>/etc/hosts
#关闭防火墙和selinux
service iptables stop
setenforce 0 >/dev/null 2>&1
sed -i '/^SELINUX=/cSELINUX=disabled' /etc/selinux/config
#配置yum源(一般是内网源)
#test network
ping -c 1 $ipremote > /dev/null 2>&1
if [ $? -ne 0 ];then
    echo "你的网络不通,请先检查你的网络"
    exit 1
else
    echo "网络ok."
fi
cat > /etc/yum.repos.d/server.repo << end
[server]
name=server
baseurl=ftp://$ipremote
enabled=1
gpgcheck=0
end

#安装软件
read -p "请输入需要安装的软件,多个用空格隔开:" soft
yum -y install $soft &>/dev/null

#备份配置文件
conf=/etc/vsftpd/vsftpd.conf
\cp $conf $conf.default
#根据需求修改配置文件
sed -ir '/^#|^$/d' $conf
sed -i '/local_enable/c\local_enable=NO' $conf
sed -i '$a anon_upload_enable=YES' $conf
sed -i '$a anon_mkdir_write_enable=YES' $conf
sed -i '$a anon_other_write_enable=YES' $conf
sed -i '$a anon_max_rate=512000' $conf
#启动服务
service vsftpd restart &>/dev/null && echo"vsftpd服务启动成功"

#测试验证
chmod 777 /var/ftp/pub
cp /etc/hosts /var/ftp/pub
#测试下载
cd /tmp
lftp $ipaddr <<end
cd pub
get hosts
exit
end

if [ -f /tmp/hosts ];then
    echo "匿名用户下载成功"
    rm -f /tmp/hosts
else
    echo "匿名用户下载失败"
fi
#测试上传、创建目录、删除目录等
cd /tmp
lftp $ipaddr << end
cd pub
mkdir test1
mkdir test2
put /etc/group
rmdir test2
exit
end

if [ -d /var/ftp/pub/test1 ];then
    echo "创建目录成功"
    if [ ! -d /var/ftp/pub/test2 ];then
        echo "文件删除成功"
        fi
else
    if [ -f /var/ftp/pub/group ];then
    echo "文件上传成功"
        else
        echo "上传、创建目录删除目录部ok"
        fi 
fi   
[ -f /var/ftp/pub/group ] && echo "上传文件成功"

Guess you like

Origin blog.51cto.com/14157628/2472572