case var in

    模式1|模式1-1)

       command。。。

        ;;

    *)

      command...

       ;;

esac


function_name(){

command

...

}


function fun_name(){

command

...

}


正则表达式:

前导字符(位于元字符前的字符);元字符就是在正则里具有特殊含义的特殊字符

.:匹配换行符以外其他任意单个字符

*:前导字符出现0次或连续出现多次ab* ab abb abbb

.*:任意长度的字符

^:行首

$:行尾

^$:空行

[]:匹配在指定字符组内的任意字符

[^]:匹配不在指定字符组内的任意字符

^[]:匹配以指定字符组内的任意字符开头

^[^]:匹配不以指定字符内的任意字符开头

\<:取单词的头

\>:取单词的尾

\<\>:精确匹配某个单词

\{n\} {n}:匹配前面字符连续出现n次

\{n,\} {n,}:匹配前面字符至少出现n次

\{n,m\} {n,m}:匹配前面字符出现n到m之前

\(\):保留被匹配到的字符



+:前导字符连续出现一次或多次

?:前导字符连续0次或一次

\d: [0-9]  匹配数字0-9

\w: [a-zA-Z0-9_] 匹配数字,字母,下划线

\s:匹配换行,制表格,空格等特殊字符


实例:

192.168.1.254 ——>192.168.0.254

\(192\.168\.\)1.254


sed -n 's/\(192\.168\.\)1.254/\10\.254/p'

sed -n 's/\(192\.168\)\.1.254/\1\.0\.254/p'


\(192\.168\.\)1\(\.254\)

sed -n 's/\(192\.168\.\)1\(\.254\)/\10\2/p'

sed -n 's#\(192\.168\.\)1\(\.254\)#\10\2#p'


helloworld myself ——>hellolilei yourself


\(hello\)world my\(self\)


sed -n 's/\(hello\)world my\(self\)/\1lilei your\2/p'


扩展正则:

grep -E 或者egrep

# grep -E 'root|ftp|halt' /etc/passwd

# egrep 'root|ftp|halt' /etc/passwd

# grep -E 'g+' 1.txt

# grep -E 'g?' 1.txt


# grep -P '\d' 1.txt

# grep -P '\w' 1.txt

# grep -P '\s' 1.txt


通配符:* ?

正则:* ?



第二类正则:


大写 [[:upper:]] [A-Z]

小写 [[:lower:]] [a-z]

字母 [[:alpha:]] [a-Z] [a-zA-Z]

制表符 [[:blank:]]

空格 [[:space:]]

纯数字 [[:digit:]] [0-9]

标点符号 [[:punct:]]

字母数字 [[:alnum:]] [a-Z0-9]




练习:

1、查找不以大写字母开头的行(三种写法)

  # grep ^[^A-Z] file.txt

2、查找有数字的行

  # grep -E '\d' file.txt

3、查找一个数字和一个字母连起来的行

  # grep [0-9][a-Z] file.txt

4、查找不以r开头的行

  # grep ^[^r] file.txt

5、查找以数字开头的行

  # grep ^[0-9] file.txt

6、查找以大写字母开头的行

  # grep ^[A-Z] file.txt

7、查找以小写字母开头的行

  # grep ^[a-z] file.txt

8、查找以.点结束的

  # grep [\.]$ file.txt

9、去掉空行

  # grep . file.txt

10、查找完全匹配abc的行

  # grep -E abc? file.txt


11、查找A后有3个数字的行

12、统计root在/etc/passwd里出现了几次

# grep -o root /etc/passwd|wc -l

13、用正则表达式截取自己的ip地址、广播地址、子网掩码

ifconfig eth0|grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}"

ifconfig eth0|grep -o "\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}"


14、找出文件中的ip地址并打印换成192.168.1.254

sed -n 's/\(192\.168\)\.0\.\(254\)/\1\.1\.\2/p'

15、找出文件中的ip地址打印出来

# grep "\([0-9]\{1,3\}\.\)\{3\}[0-9]\{3\}" 2.txt

# grep -P "\d+\.\d+\.\d+\.\d+" 2.txt


file.txt

UIYkdjfkdjf983748kfddkfjd

akdfj9874f dkjf?()*YI^&.,.l

rlkfl9089uJKGHIOUN*^%&$%^)()


634dkfjf(*&(*Jklnmfkdnlk;

kfdjA7876 098&**KJHNJK.

A789lkdfhkJKHJKLN.


192.168.0.254

djabc(*kldjfkdKJHJKLNL.

kjsdfhJKHGKJLHNKLabc308949&*^*

7867LKJHKLJ4552*(&)(



vi vim gedit emacs nano  特点:交互式


sed:流编辑器 非交互式  行处理  临时空间 默认不会直接修改源文件


命令模式: sed 选项 '命令清单<函数|定址>' filename

脚本模式: sed -f file.sed filename

        #!/bin/sed -f   建议

         command...



命令模式:

选项:

-e:进行多项编辑

-n:取消默认输出

-f:指定脚本文件

-r:扩展正则

-i:重定向输出(直接修改源文件)


命令清单:

a\(a):在当前行行后面添加内容

i\(i):在当前行的前面添加内容

c\ :用该符号后面的内容替换到匹配到的内容


d:删除行

p:打印行

r:从文件中读取行

w:保存到文件

s:搜索替换

!:对所选的行以外的行应用相应的命令

g:全局

y:将字符替换成另一个字符

&:保留查找的字符串

=:打印号


定址:

x 指定x行  sed -n 'xp' file

x,y 指定x行到y行   sed -n '1,5p' file

x,y! 匹配x行到y行以外的行 sed -n '1,38!p' /etc/passwd

/key/  匹配key关键字  sed -n '/root/p' file

/key/,x 匹配key关键字后的x行(包含关键字所在行)  sed -n '/^root/,5p' file

x,/key  从x行开始匹配到key关键字  sed -n '5,/root/p' file

/key1/,/key2/  从匹配到key1开始,匹配到key2结束 sed -n '/^root/,/^ftp/p' file


实例:

p命令 打印

sed '1p' file

sed '2,5p' file

sed -n '/root/p' file

默认情况,打印文件所有行和匹配到的行;-n只打印匹配到的行,-n和p一起使用


d删除

# head -5 /etc/passwd|sed '/root/d'

# head -5 /etc/passwd|sed '1,3d'

# head -5 /etc/passwd|sed '1,3!d'


s搜索替换

# sed -n 's/root/hello/gp' /etc/passwd

# sed -n 's/bash$/uplooking/gp' /etc/passwd

# sed -n 's/\/bin\/bash/\/sbin\/nologin/gp' /etc/passwd

自定义分割符:

# sed -n 's#/bin/bash#/sbin/nologin#gp' /etc/passwd


r读取文件内容到匹配行

# sed '/^root/r 1.txt' /etc/passwd

# sed '/root/r 1.txt' /etc/passwd  在匹配到root的所有行下面追加1.txt文件内容


w另存为

# sed  '/root/w 3.txt' /etc/passwd  屏幕打印所有,并将匹配到的内容保存到3.txt文件中

# sed -n '/root/w 3.txtp' /etc/passwd  屏幕上不输出,直接保存到文件


a\ (a):在匹配行的后面插入内容

# sed '/root/a hello' /etc/passwd

# sed '/^root/a\ hello world' /etc/passwd|head

# sed '/^root/a\

hello\

world\

888' /etc/passwd


sed '1,5a hello' file  1-5行的每一行下面插入内容

sed 'a hello' file  每一行后面插入内容

sed '$a hello' file  最后一行的后面插入内容


i\ (i):在匹配行的前面插入内容

# sed '/^root/i 888' /etc/passwd|head

# sed '/^root/i\

> hello\

> world\

> 999' /etc/passwd


sed '7a hello' file  第7行的上面插入内容

sed 'i hello' file  每一行上面插入内容

sed '$i hello' file  最后一行的前面插入内容


c\ (c) 替换已有的文本

# sed '/^root/c 88888' /etc/passwd|head

# sed '/root/c\

> hhahahahahahh\

> 9999999' /etc/passwd|head -20


sed '7c hello' file

sed '1,5c hello' file  

sed '$c hello' file


y命令 类系tr 替换 对正则表达式里的元字符不起作用


# sed '39,43y/stu/STU/' /etc/passwd|tail

# sed '39,43y/stu\:x/STU@%/' /etc/passwd|tail


-e多项编辑

# sed -e 's/root/hello/g' -e '/^stu/d' /etc/passwd

# sed -ne 's#/bin/bash#uplooking#gp' -e '/^root/c 9999' /etc/passwd


& 保留所匹配到的内容

# sed -n 's/^stu/#&/p' /etc/passwd

# sed -n 's/^#//p' passwd

# sed -n 's/^[0-9]/#&/p' 1.txt

# sed -rn 's/^root|^ftp/#&/p'

# sed -nr 's/^root|^ftp/#&/p' /etc/passwd


= 打印行号

# sed -e '/root/=' -ne '/root/p' /etc/passwd

# sed -ne '/root/p' -e '/root/=' /etc/passwd


-i 直接修改源文件

# sed -i 's/^stu/#&/p' passwd  注意:-i参数后面的p重复在源文件中出现,慎用

# sed -i 's/^#//' passwd


课堂练习:

cp /etc/passwd /tmp

1、打印匹配将任一数字替换成空或者制表符

# sed -n 's/[0-9]//gp' passwd

# sed -n 's/[0-9]/\t/gp' passwd

2、去掉文件1-5行的数字、冒号、斜杠

# sed -n '1,5s/[0-9:/]//gp' passwd

# sed -nr '1,5s#[0-9]|:|/##gp' passwd

# sed -nr '1,5s/[0-9]|:|\///gp' passwd

3、匹配root关键字的行替换成hello uplooking,并保存到test.txt文件中

# sed 's/root/hello uplooking/gw  test.txt' passwd

4、删除vsftpd.conf、smb.conf、main.cnf文件中不生效的行(不要直接修改原文件)

# sed -e '/^#/d;/^$/d' vsftpd.conf

# sed -e '/^#/d' -e '/^$/d' vsftpd.conf

# sed -r '/^#|^$/d' vsftpd.conf


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

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


# sed -r '/^#|^\t$|^$/d' main.cf

5、使用sed截取自己的ip地址

# ifconfig eth0|sed -n '2p'|sed -n 's/^.*inet addr://gp'|sed -n 's/Bcast.*//gp

6、使用sed截取除自己的ip地址、广播地址、子网掩码

# ifconfig eth0|sed -n '2p'|sed -n 's/.*inet addr:\(.*\) Bcast:\(.*\) Mask:\(.*\)/\1\n\2\n\3/p'

7、注释掉文件中5-10行

# sed -n '5,10s/^/#/gp' passwd





课后练习:

1、写一个初始化系统的脚本

1)自动修改主机名(如:ip是192.168.1.2,则主机名改为server2.uplook.com)

2)自动配置可用的yum源

3)自动关闭防火墙和selinux

2、写一个自动搭建ftp服务的脚本,要求如下:

1)不支持本地用户登录

2)匿名用户可以上传、新建、删除

3)匿名用户限速500kbps


思路:

1、过滤出自己的ip地址——>hostname——>/etc/sysconfig/network(sed -i)

2、判断本机网络是否和内网yum仓库服务器通——>配置yum源——>安装相应的软件

3、关闭防火墙和selinux——>/etc/selinux/config(sed -i)


4、修改配置文件/etc/vsftpd/vsftpd.conf(sed -i)

5、启动服务测试验证


vim vsftpd.sh

#!/bin/bash

#初始化操作系统(修改主机名、关闭防火墙和selinux、配置yum源)

ipaddr=`ifconfig eth0|sed -n '2p'|sed -e 's/.*inet addr:\(.*\) Bcast.*/\1/g'`

iptail=`echo $ipaddr|cut -d"." -f4`

ipremote=192.168.1.2


#修改主机名

hostname server$iptail.uplook.com

sed -i "/HOSTNAME/c\HOSTNAME=server$iptail.uplook.com" /etc/sysconfig/network

echo $ipaddr server$iptail.uplook.com >> /etc/hosts


#关闭防火墙和selinux

service iptables stop

chkconfig iptables off

setenforce 0 &>/dev/null

sed -i '/^SELINUX=/c\SELINUX=disabled' /etc/selinux/config


#配置yum源(内网源)

ping -c 1 $ipremote >/dev/null 2>&1

if [ $? -eq 0 ];then

  echo "网络ok"

else

  echo "网络有问题,请检查你的网络"

  exit 1

fi


rm -f /etc/yum.repos.d/*

cat > /etc/yum.repos.d/server.repo <<end

[server]

name=xxx

baseurl=ftp://$ipremote/rhel6_dvd

enabled=1

gpgcheck=0

end


#安装相应的软件

read -p "请输入你所需要安装的软件(多个软件空格隔开):" soft

yum -y install $soft &>/dev/null


#根据需求搭建ftp服务

conf=/etc/vsftpd/vsftpd.conf

cp $conf $conf.bak

sed -ri '/^#|^$/d' $conf

sed -i '/local_enable/c\local_enable=NO' $conf

sed -i '$a anon_mkdir_write_enable=YES' $conf

sed -i '$a anon_other_write_enable=YES' $conf

sed -i '$a anon_upload_enable=YES' $conf

sed -i '$a anon_max_rate=512000' $conf


#启动服务

service vsftpd restart &>/dev/null && echo "服务已经运行"


#测试验证

dir=/var/ftp

chmod o+w $dir/pub

cd /tmp

cp /etc/hosts $dir/pub


lftp $ipaddr <<end

cd pub

get hosts

put /etc/group

mkdir dir1

mkdir dir2

rmdir dir2

exit

end


if [ -d $dir/pub/dir1 ];then

  echo "目录创建成功"

  if [ ! -d $dir/pub/dir2 ];then

    echo "目录删除成功"

  fi

fi


[ -f $dir/pub/group ] && echo "文件上传成功"