shell编程

11.1基础正则表达式

正则表达式与通配符

正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配。grep、awk、sed等命令可以支持正则表达式。

通配符用来匹配符合条件的文件名,通配符是完全匹配。ls、find、cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配了。

2、基础正则表达式

“*”前一个字符匹配0次,或任意多次

grep"a*"test_rule.txt

#匹配所有内容,包括空白行

grep"aa*"test_rule.txt

#匹配至少包含有一个a的行

grep"aaa*"test_rule.txt

#匹配最少包含两个连续a的字符串

grep"aaaaa*"test_rule.txt

#则会匹配最少包含四个个连续a的字符串

“.”匹配除了换行符外任意一个字符

grep"s..d"test_rule.txt

#“s..d”会匹配在s和d这两个字母之间一定有两个字符的单词

grep"s.*d"test_rule.txt

#匹配在s和d字母之间有任意字符

grep".*"test_rule.txt

#匹配所有内容

“^”匹配行首,“$”匹配行尾

grep"^M"test_rule.txt

#匹配以大写“M”开头的行

grep"n$"test_rule.txt

#匹配以小写“n”结尾的行

grep-n"^$"test_rule.txt

#会匹配空白行

“[]”匹配中括号中指定的任意一个字符,只匹配一个字符

grep"s[ao]id"test_rule.txt

#匹配s和i字母中,要不是a、要不是o

grep"[0-9]"test_rule.txt

#匹配任意一个数字

grep"^[a-z]"test_rule.txt

#匹配用小写字母开头的行

“[^]”匹配除中括号的字符以外的任意一个字符

grep"^[a-z]"test_rule.txt

#匹配不用小写字母开头的行

grep"^[a-zA-Z]"test_rule.txt

#匹配不用字母开头的行“\”转义符

grep"\.$"test_rule.txt

#匹配使用“.”结尾的行

“\{n\}”表示其前面的字符恰好出现n次

grep"a\{3\}"test_rule.txt

#匹配a字母连续出现三次的字符串

grep"[0-9]\{3\}"test_rule.txt

#匹配包含连续的三个数字的字符串

“\{n,\}”表示其前面的字符出现不小于n次

grep"^[0-9]\{3,\}[a-z]"test_rule.txt

#匹配最少用连续三个数字开头的行

“\{n,m\}”匹配其前面的字符至少出现n次,最多出现m次

grep"sa\{1,3\}i"test_rule.txt

#匹配在字母s和字母i之间有最少一个a,最多三个a

11.2字符截取命令11.2.1cut字段提取命令

[root

localhost~]#cut[选项]文件名

选项:

-f列号:  提取第几列

-d分隔符:按照指定分隔符分割列

[root

localhost~]#vistudent.txt

IDNamegenderMark

1LimingM86

2ScM90

3GaoM83

[root

localhost~]#cut-f2student.txt

#提取第二列

[root

localhost~]#cut-f2,3student.txt

#提取第二第三列

[root

localhost~]#cut-d":"-f1,3/etc/passwd

#以:为分隔符提取第一第三列

cut命令的局限

[root

localhost~]#df-h

cut-d""-f1,3

#有空格时提取会出问题

11.2.2printf命令

[root

localhost~]#printf’输出类型输出格式’输出内容

输出类型:

%ns:输出字符串。n是数字指代输出几个字符

%ni:输出整数。n是数字指代输出几个数字

%m.nf:输出浮点数。m和n是数字,指代输出的整数位数和小数位数。如%8.2f代表共输出8位数,其中2位是小数,6位是整数。

输出格式:

\a:输出警告声音

\b:输出退格键,也就是Backspace键

\f:清除屏幕

\n:换行

\r:回车,也就是Enter键

\t:水平输出退格键,也就是Tab键

\v:垂直输出退格键,也就是Tab键

[root

localhost~]#printf%s

[root

localhost~]#printf%s%s%s

[root

localhost~]#printf%s%s%s

[root

localhost~]#printf%s%s%s\n

tips:printf%s%s%s\n

三个看成一个整体所以是一个整体,6是另一个。所以在3后面换行

printf%s$(catstudent.txt)

#不调整输出格式

printf%s\t%s\t%s\t%s\t%s\t%s\t\n$(catstudent.txt)

#调整格式输出

在awk命令的输出中支持print和printf命令

print:print会在每个输出之后自动加入一个换行符(Linux默认没有print命

printf:printf是标准格式输出命令,并不会自动加入换行符,如果需要换行,需要手工加入换行符

11.2.3awk命令

[root

localhost~]#awk‘条件1{动作1}条件2{动作2}…’文件名

条件(Pattern):

一般使用关系表达式作为条件

x10判断变量x是否大于10

x=10大于等于

x=10小于等于

动作(Action):

格式化输出

流程控制语句

[root

localhost~]#vistudent.txt

IDNamePHPLinuxMySQLAverage

1Liming.66

2Sc.66

3Gao.66

[root

localhost~]#awk{printf$2"\t"$6"\n"}student.txt

[root

localhost~]#df-h

awk{print$1"\t"$3}

提取已用百分比

BEGIN

#awkBEGIN{printf"Thisisatranscript\n"}{printf$2"\t"$6"\n"}student.txt

END

#awkEND{printf"TheEnd\n"}

{printf$2"\t"$6"\n"}student.txt

FS内置变量

#cat/etc/passwd

grep"/bin/bash"

awkBEGIN{FS=":"}{printf$1"\t"$3"\n"}

关系运算符

#catstudent.txt

grep-vName

awk$6=87{printf$2"\n"}

11.2.sed命令

sed命令

sed是一种几乎包括在所有UNIX平台(包括Linux)的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令。

[root

localhost~]#sed[选项]‘[动作]’文件名

选项:

-n:一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过    sed命令处理的行输出到屏幕。

-e:允许对输入数据应用多条sed命令编辑

-i:用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出

动作:

a\:追加,在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾需要用“\”代      表数据未完结。

c\:行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需“\”代    表数据未完结。

i\:插入,在当期行前插入一行或多行。插入多行时,除最后一行外,每行末尾需要“\”代

表数据未完结。

d:删除,删除指定的行。

p:打印,输出指定的行。

s:字串替换,用一个字符串替换另外一个字符串。格式为“行范围s/旧字串/新字串/g”(和vim

中的替换格式类似)。

学生成绩表

[root

localhost~]#vistudent.txt

IDNamePHPLinuxMySQLAverage

1Liming.66

2Sc.66

3Gao.66

行数据操作

[root

localhost~]#sed2pstudent.txt

#查看文件的第二行

[root

localhost~]#sed-n2pstudent.txt

[root

localhost~]#sed2,dstudent.txt

#删除第二行到第四行的数据,但不修改文件本身

[root

localhost~]#sed2ahellostudent.txt

#在第二行后追加hello

[root

localhost~]#sed2ihello\worldstudent.txt

#在第二行前插入两行数据

#sed2cNosuchperson‘student.txt

#数据替换

字符串替换

#sed‘s/旧字串/新字串/g’文件名

#sed3s/7/99/gstudent.txt

#在第三行中,把7换成99

#sed-i3s/7/99/gstudent.txt

#sed操作的数据直接写入文件

#sed-es/Liming//g;s/Gao//gstudent.txt

#同时把“Liming”和“Gao”替换为空

11.3字符处理命令

排序命令sort

[root

localhost~]#sort[选项]文件名

选项:

-f:忽略大小写

-n:以数值型进行排序,默认使用字符串型排序

-r:反向排序

-t:指定分隔符,默认是分隔符是制表符

-kn[,m]:按照指定的字段范围排序。从第n字段开始,m字段结束(默认到行尾)

[root

localhost~]#sort/etc/passwd

#排序用户信息文件

[root

localhost~]#sort-r/etc/passwd

#反向排序

[root

localhost~]#sort-t":"-k3,3/etc/passwd

#指定分隔符是“:”,用第三字段开头,第三字段结尾排序,就是只用第三字段排序

[root

localhost~]#sort-n-t":"-k3,3/etc/passwd

统计命令wc

[root

localhost~]#wc[选项]文件名

选项:

-l:只统计行数

-w:只统计单词数

-m:只统计字符数

11.条件判断

按照文件类型进行判断

两种判断格式

[root

localhost~]#test-e/root/install.log

[root

localhost~]#[-e/root/install.log]

[-d/root]echo"yes"

echo"no"

#第一个判断命令如果正确执行,则打印“yes”,否则打印“no”

2.按照文件权限进行判断

[-wstudent.txt]echo"yes"

echo"no"

#判断文件是拥有写权限的

两个文件之间进行比较

ln/root/student.txt/tmp/stu.txt

#创建个硬链接吧

[/root/student.txt-ef/tmp/stu.txt]echo"yes"

echo"no"yes

#用test测试下,果然很有用

两个整数之间比较

[23-ge22]echo"yes"

echo"no"yes

#判断23是否大于等于22,当然是了

[23-le22]echo"yes"

echo"no"no

#判断23是否小于等于22,当然不是了

、字符串的判断

name=sc

#给name变量赋值

[-z"$name"]echo"yes"

echo"no"

no

#判断name变量是否为空,因为不为空,所以返回no

aa=11

bb=22

#给变量aa和变量bb赋值

["$aa"=="bb"]echo"yes"

echo"no"

no

#判断两个变量的值是否相等,明显不相等,所以返回no

6、多重条件判断

aa=11

[-n"$aa"-a"$aa"-gt23]echo"yes"

echo"no"

no

#判断变量aa是否有值,同时判断变量aa的是否大于23

#因为变量aa的值不大于23,所以虽然第一个判断值为真,返回的结果也是假

aa=2

[-n"$aa"-a"$aa"-gt23]echo"yes"

echo"no"yes

11.流程控制11..1if语句

单分支if条件语句

单分支条件语句需要注意几个点

if语句使用fi结尾,和一般语言使用大括号结尾不同

[条件判断式]就是使用test命令判断,所以中括号和条件判断式之间必须有空格

then后面跟符合条件之后执行的程序,可以放在[]之后,用“;”分割。也可以换行写入,就不需要“;”了

例子:判断分区使用率

双分支if条件语句

例子1:备份mysql数据库

例子2:判断apache是否启动

多分支if条件语句

例子

11..2case语句

多分支case条件语句

case语句和if…elif…else语句一样都是多分支条件语句,不过和if多分支条件语句不同的是,case语句只能判断一种条件关系,而if语句可以判断多种条件关系。

11..3for循环

语法一

输出:

thiscityisbeijing

thiscityisnanjing

thiscityisshanghai

语法二

11..while循环与until循环

while循环

while循环是不定循环,也称作条件循环。只要条件判断式成立,循环就会一直继续,直到条件判断式不成立,循环才会停止。这就和for的固定循环不太一样了。

until循环

until循环,和while循环相反,until循环时只要条件判断式不成立则进行循环,并执行循环程序。一旦循环条件成立,则终止循环。

11.6函数

语法:

[]-表示可以省略

tips:在以上的函数语法中,前面的funcation表示声明一个函数!!!可以不写return-n是指退出函数

参考:



转载请注明地址:http://www.sanbaicaoasb.com/scgj/8424.html
  • 上一篇文章:
  • 下一篇文章:
  • 热点文章

    • 没有热点文章

    推荐文章

    • 没有推荐文章