shell编程

shell编程

一、正则表达式

1、概述

1)正则表达式用来在文件中匹配符合条件的字符串。(grep、awk、sed)

2)通配符用来匹配符合条件的文件名。(locate、find、cp)

2、基础正则表达式

元字符

作用

*

前一个字符匹配0次或任意多次。

.

匹配除了换行符外任意一个字符。

^

匹配行首。例如:^hello会匹配以hello开头的行。

$

匹配行尾。例如:hello$会匹配以hello结尾的行。

[ ]

匹配中括号中指定的任意一个字符,只匹配一个字符。

例如:[aoieu]匹配任意一个元音字母。[0-9]匹配任意一个数字,[a-z][0-9]匹配小写字和一位数字构成的两位字符。

[^]

匹配除中括号的字符外的任意一个字符。例如:[^0-9]匹配任意一位非数字字符,[^a-z]表示任意一位非小写字符。

\

转义符。用于取消特殊符号的含义取消。

\{n\}

表示其前面的字符恰好出现n次。[0-9]\{4\}匹配4为数字,[1][3-8][0-9]\{9\}匹配手机号码。

\{n,\}

表示其前面的字符出现不小于n次。例如:[0-9]\{2,\}表示两位及以上的数字。

\{n,m\}

表示其前面的字符至少出现n次,最多出现m次。例如:[a-z]\{6,8\}

匹配6到8位的小写字母。

说明:在~./bashrc文件中建立grep别名:

[root@localhost ~]# vi /root/.bashrc

alias grep=’grep –color=auto’

3、扩展正则表达式

扩展元字符

作用

+

前一个字符匹配1次或任意多次。

前一个字符匹配0次或1次。

|

匹配两个或多个分支选择。

()

匹配其整体为一个字符。

二、字符截取和替换命令

1、cut列提取命令(不推荐用于有空格的提取)

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

-f  列号        #提取第几列

-d 分隔符     #指定分隔符分割列

-c 字符范围 #指定字符串范围来进行字段提取。

例:[root@localhost ~]# cut –c 8- student.txt

2、awk编程

1.概述(略)

2.printf格式化输出

[root@localhost ~]# printf‘输出类型输出格式’ 输出内容

输出类型:

%s          输出字符串。

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

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

\a           支持转义符。

例:[root@localhost ~]# printf‘%s’$(cat student.txt)

3.awk的基本使用

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

条件(pattern):

说明:一般使用关系表达式作为条件。

x > 10     判断变量x是否大于10

x == y    判断变量x是否等于变量y

A ~ B 判断字符串A是否包含能匹配B表达式的子字符串

A !~ B 判断字符串A是否不包含能匹配B表达式的子字符串

动作(action):

1)格式化输出

2)流程控制语句

4.awk的条件

条件的类型

条件

说明

awk保留字

BEGIN

在awk程序一开始时。尚未读取任何数据之前执行。BEGIN后的动作只在程序开始执行一次。

END

在awk程序处理完所有数据,即将结束时执行。END后的动作只在程序结束时执行一次。

关系运算符

>

大于

<

小于

>=

大于等于

<=

小于等于

==

等于(判断式)

!=

不等于

A~B

判断字符串A是否包含能匹配B表达式的子字符串

A!~B

判断字符串A是否不包含能匹配B表达式的子字符串

正则表达式

/正则/

如果在“//”中可以写入字符,也可以支持正则表达式

例:[root@localhost ~]# awk ‘BEGIN{ FS=”:” } {print $2 ,$6 }’student.txt

       [root@localhost ~]# awk ‘$6 >=89 {print $2 }’student.txt

[root@localhost ~]# awk ‘$2 ~ /Yz/ {print $6 }’student.txt

[root@localhost ~]# awk ‘/Yuyuz/ {print $6 }’student.txt

5.awk内置变量

awk内置变量

作用

$0

代表目前awk所读入的整行数据。$0就代表当前读入行的整行数据。

$n

代表目前读入行的第n个字段。

NF

当前行拥有的字段(列)总数。

NR

当前awk所处理的行,是总数据的第几行。

FS

用户定义分隔符。

6.awk流程控制

1)awk函数

function 函数名 (参数列表){

函数体

}

7.awk中调用脚本

[root@localhost ~]# awk –f pass.awk /etc/passwd

-f 使用该选项来调用脚本

3、sed命令

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

选项:

-n 输出处理的行

-f 脚本文件名

-i 修改文件数据

-e 多条sed命令处理输入的数据

-r 支持扩展正则

动作:

a 追加

c 替换

i 插入

d 删除

p 打印

s 字符串替换

说明:sed不会直接改变文件的内容。除非加“-i”选项。

例:[root@localhost ~]# sed ‘2p’ student.txt

       [root@localhost ~]# cat student.txt | sed ‘2c No search person’

三、字符处理命令

1、排序命令sort

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

-f           #忽略大小写

-b          #忽略每行前面的空白部分

-n          #以数值型进行排序

-r           #反向排序

-u          #删除重复行

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

-k n[,m]  #按照指定的字段范围排序

例:[root@localhost ~]# cat /etc/passwd | sort –n -t “:” –k 3,3

2、消除重复行命令uniq

uniq [选项] 文件名

-i           #忽略大小写

3、统计命令wc

[root@localhost ~]# wc -lwc

-l          #只统计行数

-w         #只统计单词数

-c          #只统计字符数

四、条件判断

1、按照文件类型进行判断

测试选项

作用

-b文件

判断该文件是否存在。(是设备文件为真)

-c文件

判断该文件是否存在。(是字符设备文件为真)

-d文件

判断该文件是否存在。(是目录文件为真)

-e文件

判断该文件是否存在。(存在为真)

-f文件

判断该文件是否存在。(是普通文件为真)

-L文件

判断该文件是否存在。(是符号连接文件为真)

-p文件

判断该文件是否存在。(是管道文件为真)

-s文件

判断该文件是否存在。(非空为真)

-S文件

判断该文件是否存在。(是套接字为真)

例:[ -e /root/sh/ ]

[root@localhost ~]# echo $?

[root@localhost ~]#date=$(date +%y%m%d)

[root@localhost ~]#date=$(date +%F)

[root@localhost ~]# [ -d /root/test ] && echo “yes”|| echo “no”

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

测试选项

作用

-r文件

判断该文件是否存在。(有读权限为真)

-w文件

判断该文件是否存在。(有写权限为真)

-x文件

判断该文件是否存在。(有执行权限为真)

-u文件

判断该文件是否存在。(有SUID权限为真)

-g文件

判断该文件是否存在。(有SGID权限为真)

-k文件

判断该文件是否存在。(有SBit权限为真)

例:[root@localhost ~]# [ -w /root/student.txt ] && echo “yes”|| echo “no”

3、两个文件之间进行比较

测试选项

作用

文件1 –nt 文件2

判断文件1的修改时间是否笔文件2的新(如果新则为真)

文件1 –ot 文件2

判断文件1的修改时间是否笔文件2的旧(如果旧则为真)

文件1 –ef 文件2

判断文件1和文件2的inode号是否一致。判断连接文件

例:[root@localhost ~]# [ /root/student.txt –ef /tmp/student.txt ] && echo“yes”|| echo“on”

4、两个整数之间比较

测试选项

作用

整数1 –eq 整数2

判断整数1是否和整数2相等(相等为真)

整数1 –ne 整数2

判断整数1是否和整数2不相等(不相等为真)

整数1 –gt 整数2

判断整数1是否大于整数2(大于为真)

整数1 –lt 整数2

判断整数1是否小于整数2(小于为真)

整数1 –ge 整数2

判断整数1是否大于等于整数2(大于等于为真)

整数1 –le 整数2

判断整数1是否小于等于整数2(小于等于为真)

例:[root@localhost ~]# [ 23 –le 24 ] && echo “yes”|| echo “no”

5、字符串的判断

测试判断

作用

-z字符串

判断字符串是否为空(为空返回真)

-n字符串

判断字符串是否为非空(非空返回真)

字符串1 == 字符串2

判断字符串1是否和字符串2相等(相等返回真)

字符串1 != 字符串2

判断字符串1是否和字符串2不相等(不相等返回真)

例:[root@localhost ~]# [ -z name ] && echo “yes”|| echo “no”

       [root@localhost ~]# [ $name == “abc” ] && echo “yes”|| echo “no”

6、多重条件判断

测试选项

作用

判断1 –a 判断2

逻辑与。

判断1 -o 判断2

逻辑或。

!判断

逻辑非,取反。

例:[root@localhost ~]# [ ! –n “$nu”-a “$nu”-gt  23 ] && echo “yes”|| echo “no”

       [root@localhost ~]# [ ! –n “$nu”] && echo “yes”|| echo “no” 

五、控制流程

1、if条件判断

if  [条件判断式]

then

程序

fi

if  [条件判断式];then

程序

fi

2、双分支if条件语句

if  [条件判断式]

then

条件成立

else

条件不成立

fi

3、多分支if条件语句

if  [条件判断式1]

then

条件1成立

elif  [条件判断式2]

then

条件2成立

else

条件不成立

fi

4、多分支case条件语句

case $变量名 in

“值1”)

;;

“值2”)

;;

  *)

;;

esac

5、for循环

语法一:

for 变量 in 值1 值2 ……

       do

程序

done

语法二:

for((初始值;循环控制条件;变量变化))

do

程序

done

6、while循环

while  [条件判断式]

do

  程序

done

7、until循环

until  [条件判断式]

do

   程序

done

8、函数(function)

function 函数名 (){

   程序

}

9、特殊流程控制语句

1)exit [返回值]

2)break语句(跳出循环)

3)continue 语句 (跳出本次循环)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图个吉利儿

欢迎大家一起学习!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值