坚持#第245天~正则表达式

来源:互联网 发布:淘宝美工面试作品 编辑:程序博客网 时间:2024/06/16 06:00

上周五测试的讲解:

将命令变成系统命令(可以直接敲),怎么做呢?

有个环境变量PATH,功能,执行任何命名都会在这个路径里面去搜索,它具有搜索功能!做法:把制作的脚本放在其中的某个目录里面,或者将制作脚本的目录加入PATH变量里面,注意权限为700

判断有没有jim这个用户:grep “^jim:”/etc/passwd注意^jim:这样更好

扩展:组管理员的成员+普通组的成员一起输出

5类ip地址:

A:1-127

B:128-191

C:192-223

D:224-239多点播送

E:240-254做实验

 

for i in`grep /bin/bash$ /etc/passwd | grep -v root | cut -d: -f1`;do userdel -r$i;done

 

pxe能同意装好几台,装好之后就能发送

 

双色球红球避免重复的好方法:

使用sort和uniq,这种方法是刘福元想出来的,太厉害了

思路是关键字,重复,就想到了uniq,哈哈,太巧了

> tmp.txt

while [`sort tmp.txt | uniq | wc -l` !=6 ];do

    echo “$[RANDOM%33+1]” >> tmp.txt

done

echo “red:`sorttmp.txt | uniq`”

还有一种是老师的点名,点到一个删除一个数组数据,这种也不错:

[ -z “${name_list[*]}”] && name_list={`sed ‘1d’ /var/ftp/pub/scripts/name.txt` &&num=${#name[*]}}

ran=$[RANDOM%num]

while [ -z “${name_list[ran]}”];do

    ran=$RANDOM%num

done

echo${name_list[ran]}

unset name_list[ran]

 

凡哥练习题:

0.描述vim三种工作模式的作用。如何切换模式?

命令模式(esc)、插入模式(a/i/o)、尾行模式(:)

 

1.显示/etc/passwd文件的前5行内容,并显示行号

grep -n"" /etc/passwd | head -5

 

2.将第1题的结果重定向覆盖写入到/tmp/pwd.txt文件中。

grep -n"" /etc/passwd | head -5 > /tmp/pwd.txt

 

3.用vim打开第2题的文件,复制第1到第3行内容,粘贴到文件最后一行下面。

vim/tmp/pwd.txt

G :1,3 co .

 

4.将文件中所有的sbin替换成SBIN。删除文件中所有的SBIN。

:%s#sbin#SBIN#g

:%s#SBIN##g

 

5.将文件中第2行所有的:冒号替换成;分号。在文件中查找;号。

:2 s#:#;#g

esc

/;

 

6.删除文件中的第1~3行内容。撤消操作。反撤消操作。

:1,3d

 

7.将文件另存为/tmp/pk.txt。

:w  /tmp/pk.txt

 

8.显示行号。不显示行号。保存文件并退出vim程序。

:set nu

:set nonu

:wq或 x

 

9.显示系统中的命令别名。

alias

 

10.切换到/etc/sysconfig/network-scripts目录,显示当前工作路径,显示文件列表及详细信息。

cd /etc/sysconfig/network-scripts

pwd

ls -l或ll

 

11.切换到上一级目录,切换到上一次访问的目录,切换到当前用户的家目录。查看电脑ip,查看cpu型号。查看内存容量。

cd  ..

cd  -

cd

ifconfig

lscpu或cat /proc/cpuinfo

free -h或cat /proc/meminfo

 

[1-9][0-9]匹配10-99中的任意一个字符

[1-5][0-5]匹配10-15,20-25,30-35,40-45,50-55

2.5888

205888

215888

2a5888

265888

grep “2.5”会显示全部的内容,这个.默认代表任意字符,相当于an5

grep “2\.5”只会显示出2.5,转义一下就只代表.了

grep “2..5”相当于2nn5

 

注意力集中:

like

love

想要替换like和love为liker和lover怎么办:

有规律:以l开头,以e结尾

:%s#\(l..e\)#\1r#g   \1是第一组的意思,相当于$1哈哈哈,\1r就是lover和liker了

 

192.168.1.20替换为30

%s#\(192.168.1.\)20#\130#g  这个\130相当于$1后面加上30 ,带上20是直接把这些东西都替换成$1加上30,就相当于:%s#192.168.1.20#192.168.1.30#g

 

192.168.1.30

192.168.1.130

192.168.1.31

192.168.1.33

192.168.1.120

192.168.1.111

192.168.1.150

全换为2网段:

:%s#\(192.168.\)1\(.*\)#\12\2#g相当于$1加上2加上$2

注意.*要扩到一起,光是扩*识别不到:

:%s#192.168.1\(.*\)#192.168.2\1#

 

 

www.uplooking.com.cnwww.uplook.cn
:%s#\(www.\)\(uplook\)ing.com\(.cn\)#\1\2\3#

 

例子:

1.使用模式匹配(模式就是grep “模式”)555222

555222

5555222

5555555555222

5552224444

4444555222

grep"^555222$" pipei.txt

订正:grep “^\(555222\)$”pipei.txt

grep "\<555222\>"pipei.txt 噢,忘了还有无弊端的精确匹配\<和\b

或grep “\<5\{3\}2\{3\}\>”pipei.txt用匹配出现几次的方法也行

 

2.匹配单词ac中间任意

grep"a.*c" g.txt

订正:贪婪匹配,需要戒掉贪婪

grep "\<a.*c\>"g.txt

 

3.删除每行的第二个字符

只会用ctrl+v!但是遇到了不等宽的字段没辙了

订正:

vim/etc/passwd进去

:%s#正数第二个##

:%s#\(.\)\(.\)#\1#

删除每行的倒数第二个字符

:%s#\(.\)\(.$\)#\2#注意是保留最后一个,删除倒数第二个,凡哥好聪明呀

 

4.匹配1~254

grep"[0-2][0-5][0-4]" pipei.txt有问题!

打印1-300然后丢到文件里去:

seq 300 | tr"\n" " " > num.txt

echo>> num.txt追加回车

从个位、十位、百位来思考哦

1~9:[1-9]

10~99:[1-9][0-9]

100~199:1[0-9][0-9]居然还可以把1写到括号的外面

200~249:2[0-4][0-9]

250~254:25[0-4]

记住最前面的不能是0!1~9要单独写

 

练习:0~96

catnum.txt | grep "\<[1-8][0-9]\>\|\<9[0-6]\>"注意用|隔开,|需要使用转义符\,然后再需要用无弊端精确匹配<>,也需要使用转义符号\,方括号不需要用转义字符\,小括号需要转义,大括号需要转义(大括号在脚本里面不需要转义),尖括号需要转义,在脚本里面可以写+号

最后写为:cat num.txt | grep"\<[0-9]\>\|\<[1-8][0-9]\>\|\<9[0-6]\>"

 

这个是错的:000~254:[0-2][0-5][0-4]注意没有到9就匹配不到所有的哈,一看就知道错了,因为最前面的不能是0啊,除非是[1-2][0-5][0-4]

 

[1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4]用一个|符号分隔开(注意要转义字符\),然后需要用无弊端精确匹配:

\<[1-9]\>\|\<[1-9][0-9]\>\|\<1[0-9][0-9]\>\|\<2[0-4][0-9]\>\|\<25[0-4]\>

最后结果为:

catnum.txt | grep"\<[1-9]\>\|\<[1-9][0-9]\>\|\<1[0-9][0-9]\>\|\<2[0-4][0-9]\>\|\<25[0-4]\>"

 

\<[1-9]\>\|\<[1-9][0-9]\>\|\<1[0-9][0-9]\>\|\<2[0-4][0-9]\>\|\<25[0-4]\>

[1-9]|[1-9][0-9]

[1-9]{0,1}[0-9]会出现0

\<[1-9]\{0,1\}[0-9]\>\|\<1[0-9][0-9]\>\|\<2[0-4][0-9]\>\|\<25[0-4]\>

合并:

# grep"\<[1-9]\{0,1\}[0-9]\>\|\<1[0-9][0-9]\>\|\<2[0-4][0-9]\>\|\<25[0-4]\>"  num1.txt

所以得出结论:最好不要合并,合并之后会出现0,就用普通的就行了,通俗易懂

 

扩展正则表达式:

catnum.txt | grep"\<[1-9]\>\|\<[1-9][0-9]\>\|\<1[0-9][0-9]\>\|\<2[0-4][0-9]\>\|\<25[0-4]\>"改为:

# grep -E"\<[1-9]{0,1}[0-9]\>|\<1[0-9]{2}\>|\<2[0-4][0-9]\>|\<25[0-4]\>"  num1.txt将合并的分开:

# grep -E"\<[1-9]|[1-9][0-9]\>|\<1[0-9][0-9]\>|\<2[0-4][0-9]\>|\<25[0-4]\>"  num1.txt整理:

# grep -E"\<[1-9]\|[1-9][0-9]\>\|\<1[0-9][0-9] \>\|\<2[0-4][0-9]\>\|\<25[0-4]\>"  num1.txt

正则表达式的扩展
?

+

grep -E

看笔记

为什么要加-E呀?

加了-E能够使用?和+呀

? 表示0个或1个它前面的字符  和{0,1}一样

+ 表示1个或多个它前面的字符  和{1,}一样

注意+和?是接在[]后面的,在脚本里面可以写+号

注意大括号{}是接在[]后面的

 

5.匹配邮箱地址

别忘了无弊端精确匹配

vim mail.txt

12311225@qq.com

12dsaf@163.com

12,..@163.com

sdfAA@qq.com

dsfajg@.qq.com.cn

dsaf@.qq.com

ddoasgijsadiogj.com

答案:

grep -E"\<[0-9a-zA-Z]+@[0-9a-zA-Z]+\.com\>" mail.txt

 

6.把每个数字用()括起来(数字数字,不要忘记了方括号)

vim num.txt

要把这个变成组,组要括起来,然后才能用\1表示$1,小括号需要转义,方括号不需要转义,大括号需要转义(大括号在脚本里面不需要转义),尖括号需要转义,如果出现大规模的改变,就是没有写尖括号,在脚本里面可以写+号

哈哈,在vim里面不能用grep -E,就只好用大括号了

 

7.判断用户输入的是否是数字

1~199

/1[0-9][0-9]

vim 没有做特殊设置的时候只能使用基本正则表达式

订正:

[0-9]{1,}或[0-9]+代表1次或多次

vimpanduan.sh

read -p"input(1~199):" num

if [[ $num=~ [0-9]+ ]];then(只要有数字就是数字)注意=~要使用两个方括号[[]],取反的话在[[ !这里写感叹号

    echo "this is a number!"

else

    echo "input error!"

fi

精确

一个或多个

 

加双引号是错的

 

正确的:发现在脚本里面写的正则表达式不能用无弊端精确匹配,但是能用^[0-9]+$,而且不能用大括号{}

 

不能是负数和小数

 

写上引号会报错

写上词会报错(在脚本里不能用无弊端精确匹配,但能用^$)

支持花括号,但不要带上\,大括号在脚本里面不需要转义

 

判断输入的最好使用^$,判断是否是数字(非负数的整数):if [[ $num =~^[0-9]+$ ]]或if [[ $num=~ ^[[:digit:]]+$ ]](同样负数和小数不行)

 

吴老师面试题:

i节点inode节点包含了描述文件的全部信息

nfs网络文件系统,适用于linux和linux之间的文件共享

linux文件系统中每个文件用inode节点来标识

全部磁盘块由四个部分组成,分别为引导块、专用块、inode节点表块,数据存储块。

超级块包括了inode节点块、空闲块

网络管理的重要任务是:控制和监控

静态路由ip设定后,若网络拓扑结构发生变化,需系统管理员修改路由ip地址

安装linux,在系统分区的时候必须要有两种分区类型:文件系统分区和交换分区

 

2017/12/19

 

 

 

 

14.sed?

 

15.awk?

 

 

 

 

 

 

作业:

bilibili的马哥教育

凡哥笔记1就剩作业了(留着和吴老师发的面试题一起看)

 

交换机和路由器的关系:

网线的颜色顺序:

静态路由和动态路由:静态路由自己分配ip地址,动态路由DHCP自动分配ip地址

备份:系统备份(操作系统)、用户备份(文件)

每个用户的每个标识是什么?uid

编程语言、上线、领导

系统管理员:资源管理、性能管理、用户管理、进程管理、资源管理

 

 

大后期需要整合出一个万能答案

 

 

周四考试

 

 

 

 

 

作业

10.1作业:将公钥发送到能和本机通信的pc。不能通信发送失败将信息记录

#!/bin/bash

# 将公钥发送到192.168.1.1~192.168.1.10密码是1

[ ! -f/tmp/ip.txt ] && > /tmp/ip.txt

for((i=1;i<=10;i++));do

if [ $(ping -w 2 192.168.1.$i | grep "loss" | cut -d" "-f6) == "0%" ];then

        /usr/bin/expect<< ok

        spawnssh-copy-id 192.168.1.$i

        expect"yes/no"

   send"yes\n"

        expect"password"

        send"1\n"

expect eof

ok

else

    echo "192.168.1.$i notalive" >> /tmp/ip.txt

fi

 

1.写点名脚本

略略略

 

2.匹配用户名是三个字符的用户

解:

cat/etc/passwd| cut -d: -f1 | grep -v "-" | grep"\<...\>"

 

3.删除每行的倒数第二个字符

解:

:%s#\(.\)\(.$\)#\2#

 

4.显示/boot/grub2/grub.cfg文件中至少一个空白字符开头的行

解:

cat/boot/grub2/grub.cfg | tr -s "\n" | grep "^ "

 

5.删除每行的倒数第一个字符

:%s#\(.\)\(.$\)#\1#

 

6.将square和fair调换位置

square andfair   ---->fair and square

解:

:%s#squareand fair   ---->fair and square#fairand square   ---->square and fair#g

 

7.删除每行的第一个单词(纯字母)

解:

:%s#^[a-zA-Z]\{1,\}##g

 

8.删除某文件中以#号开头及后面至少有一个空白字符的行

解:

grep -v"^# " pass.txt

 

9.删除某文件中开头的不是注释行的#号

解:

:%s@\(^.\{1,\}\)\(#\{1,\}\)@\1@

 

10.显示/etc/vsftpd/vsftpd.conf文件中不是#号开头的行

解:

grep -v"^#" /etc/vsftpd/vsftpd.conf

 

11.将倒数第一个字符和倒数第二个字符交换位置

解:

:%s#\(.\)\(.$\)#\2\1#

 

12.判断用户输入的内容是大写字母,还是小写字母,还是数字,还是特殊符号,如何是混合的输出你输入了有什么,例:输入A1,你输入了大写字母,数字

解:

read -p"input:" input

if [[ $input=~ [0-9]+ ]];then

    echo "你输入了数字"

fi

if [[ $input=~ [A-Z]+ ]];then

    echo "你输入了大写字母"

fi

if [[ $input=~ [a-z]+ ]];then

    echo "你输入了小写字母"

fi

if [[ !$input =~ [0-9A-Za-z]+ ]];then

    echo "你输入了特殊符号"

fi

 

 

1.使用case实现成绩的优良差的判断

90-100  非常优秀     

80-89    优秀           

70-79    良好             

61-69    还需努力成绩不理想  

60         刚刚及格       

0-59      差         

如果输入的不是数字 提示输入的内容不正确,请重新输入  

输入exit退出,其他不退出

解:

vim case.sh

for((;;));do

    read -p "input score:" score

    if [[ ! $score =~ ^[0-9]+$ ]];then

        echo "输入的内容不正确,请重新输入"

    else

        break

    fi

done

case $scorein

9[0-9]|100)

    echo "非常优秀";;

8[0-9])

    echo "优秀";;

7[0-9])

    echo "良好";;

6[1-9])

    echo "还需努力成绩不理想";;

60)

    echo "刚刚及格";;

[0-9]|[1-5][0-9])

    echo "差";;

exit)

    exit;;

*)

    echo "输入的范围不正确,请输入0~100"

esac

 

2.vim删除每行的第一个字符

解:

:%s#^.##g

 

3.vim在每行行首添加hello字段

解:

:%s#^#hello#g

 

4.vim将ro或re替换成A

解:

:%s#ro\|re#A#g

 

5.编写初始化脚本

    配置yum源

    安装虚拟机软件

    安装cherrytree

    安装ntfs-3g

    安装stardict

    按q键退出程序

脚本必须有选择菜单

解:

vim/scripts/yumAuto.sh

echo -e "[localyum]\nname=centos7u3\nbaseurl=file:///mnt/centos7u3\ngpgcheck=0\nenabled=1">> /etc/yum.repos.d/localyum.repo

mkdir/scripts

umount/dev/sr0

mount/dev/sr0 /mnt/centos7u3我忘记挂载在哪儿了啊

yum cleanall

yumrepolist
原创粉丝点击