128-156-linux-shell编程

12 篇文章 0 订阅

128-linux-shell编程:

1.正则表达式

1、基础正则表达式

元字符作用
*前一个字符匹配0次或任意多次。
.匹配除了换行符外任意一个字符。
^匹配行首。例如:^hello会匹配以he1llo开头的行。
$匹配行尾。例如:hello&会匹配以hello结尾的行。
[]匹配中括号中指定的任意一个字符,只匹配一个字符。例如:[aoeiu]匹配任意一个元音字母,[0-9]匹配任意一位数字,[a-z] [ 0 - 9 ]匹配小写字和一位数字构成的两位字符。
[^]匹配除中括号的字符以外的任意一个字符。例如:[ ^0-9 ]匹配任意一位非数字字符,[ ^a-z]表示任意一位非小写字母。
\转义符。用于取消讲特殊符号的含义取消。
\{n\}表示其前面的字符恰好出现n次。例如:[O-9]{4}匹配4位数字
\{n,\}表示其前面的字符出现不小于n次。例如:[O-9]{2,}表示两位及以上的数字。
\{n,m\}表示其前面的字符至少出现n次,最多出现m次。例如:[a-z] {6,8}匹配6到8位的小写字母。

2、扩展正则

正则表达式中应该还可以支持一些元字符,比如“+”“?”“l”“() ”。Linux是支持这些元字符的,但grep命令默认不支持而已。如果要想支持这些元字符,必须使用egrep命令或grep -E选项,所以我们又把这些元字符称作扩展元字符。

扩展元字符作用
+前一个字符匹配1次或任意多次。如“go+gle”会匹配“gogle”、 “google”或“gooogle”,当然如果“o”有更多个,也能匹配
前一个字符匹配О次或1次。如“colou?r”可以匹配“colour”或“color”。
l匹配两个或多个分支选择。如“was|his"会匹配既包含“was”的行,也匹配包含"his"的行
()匹配其整体为一个字符,即模式单元。可以理解为由多个单个字符组成的大字符。如“(dog)+”会匹配“dog”、“dogdog”、 “dogdogdog”等,因为被()包含的字符会当成一个整体。但“hello(world|earth)”会匹配“hello world”及“hello earth”。

2.字符截取和替换命令

1、cut,默认支持tab键

[root@localhost~]# cut	[选项]	文件名
-f 列号:提取第几列
-d分隔符:按照指定分隔符分割列
-c字符范围:不依赖分隔符来区分列,而是通过字符范围(行首为0)来进行字段提取。“n-”表示从第n个字符到行尾;“n-m”从第n个字符到第m个字符;“-m”表示从第1个字符到第m个字符。
例如:
[root@localhost ~]# cut -f 2,3 student.txt
[root@localhost ~]# cut -c 8- student.txt
[root@localhost~]# cut -d ":"-f 1,3 /etc/passwd

2、printf格式化输出

[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 键
#student.txt
ID      Name    gender  Mark    Average
1       Liming  M       86      87.65
2       Sc      M       90      85.32
3       Tg      M       83      92.45
例如:
[root@localhost~]# printf '%i\t %s \t %i\t %i\t %i\t %8.2f\t \n’\$(cat student.txt | grep -v Name)

3、awk的基本使用

[root@localhost~]# awk	‘条件1	{动作1}	条件2	{动作2}…’	文件名
条件(Pattern) :
	一般使用关系表达式作为条件。例如:x >10判断变量x是否大于10
	x== y判断变量x是否等于变量y
	A ~ B判断A中是否包含能匹配B表达式的子字符串
	格式化输出
	流程控制语句
例如:[root@localhost ~]# awk '{printf $2 "\t" $6 "\n"}’ student.txt#输出第二和第六列
[root@localhost~]# df -h / awk '{print $1 "\t"$3}’

awk的条件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n6FK9ZON-1670680653221)(png/1644456149547.png)]

例如:

[root@localhost~]# awk 'BEGIN {printf “This is a transcript \n”} {printf $2 “\t”$6 “\n”}’ student.txt

[root@localhost ~]# cat student. txt | grep -v Name l awk ‘$6 >= 87 {printf $2 “\n” }’

awk支持正则表达式

[root@localhost~]# df -h | awk '/sda[0-9]/ {printf $1"\t"$5 “\n"}’#查询包含有sda数字的行,并打印第一字段和第五字段

awk内置变量(前五个常用,其他不常用)

1、$0:代表目前awk所读入的整行数据。awk是一行一行读入数据的,$0就代表当前读入行的整行数据。

2、$n:代表目前读入行的第n个字段。
3、NF:当前行拥有的字段(列)总数。
4、NR:当前awk所处理的行,是总数据的第几行。
5、FS:用户定义分隔符。awk 的默认分隔符是任何空格,如果想要使用其他分隔符(如“:”),就需要FS变量定义。
6、ARGC:命令行参数个数。
7、ARGV:命令行参数数组。
8、FNR:当前文件中的当前记录数(对输入文件起始为1)。
9、OFMT:数值的输出格式(默认为%.6g)。
10、OFS:输出字段的分隔符(默认为空格)。
11、ORS:输出记录分隔符(默认为换行符)。
12、RS:输入记录分隔符(默认为换行符)。

举例:
[root@localhost~]# cat /etc/passwd | grep " /bin/bash”l \awk ‘BEGIN {FS=“:”}{printf $1 “\t” $3 “\n”}’

awk函数:

awk编程也允许在编程时使用函数,定义方法如下:
function 函数名(参数列表){
函数体
}
[root@localhost~]# awk 'function test(a, b) { printf a "\t" b "\n" }
{ test($2,$6) } ' student.txt
#调用函数test,并向两个参数传递值。#定义函数test,包含两个参数,函数体的内容是输出这两个参数的值
Name	Average
Liming 	87.66
Sc		85.66

awk调用脚本

例如,[root@localhost ~]# vi pass. awk
BEGIN {FS=":}
{ print $1 "\t"$3}
可使用“-f”选项来调用这个脚本:
[root@localhost~]# awk -f pass. awk /etc/passwd

4、sed命令:

sed主要是用来将数据进行选取、替换、删除、新增的命令,
[root@localhost ~]# sed	[选项]	‘[动作]’	文件名
选项:
-n:一般sed命令会把所有数据都输出到屏幕,如果加入此选择,则只会把经过sed命令处理的行输出到屏幕。
-e:允许对输入数据应用多条sed命令编辑。
-f 脚本文件名:从sed脚本中读入sed操作。和 awk命令的-f非常类似。
一r:在sed中支持扩展正则表达式。
-i:用sed 的修改结果直接修改读取数据的文件,而不是由屏幕输出动作:
a \:追加,在当前行后添加一行或多行。添加多行时,除最后一行外,每行末尾需要用“\”代表数据未完结。
c \:行替换,用c后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需用“\”代表数据未完结。
i \:插入,在当期行前插入一行或多行。插入多行时,除最后一行外,每行末尾需要用“\”代表数据未完结。
d:删除,删除指定的行。
p:打印,输出指定的行。
s:字串替换,用一个字符串替换另外一个字符串。格式为“行范围s/旧字串/新字串/g”(和vim中的替换格式类似)。
例如:
[root@localhost ~]# sed -n '2p’student.txt1 #查看第2行数据
[root@localhost~]# sed -i '2,4d’student.txt#删除2-4行数据
[root@localhost~]# sed '2a hello' student.txt#在第二行后加入 hello

5、字符处理命令 sort uniq wc

#sort默认按照每行开头第一个字符进行排序
[root@localhost~]# sort	[选项]	文件名
一f:忽略大小写
一b:忽略每行前面的空白部分
-n:以数值型进行排序,默认使用字符串型排序
一r:反向排序
一u:删除重复行。就是uniq命令
-t:指定分隔符,默认是分隔符是制表符
-k n[,m]:按照指定的字段范围排序。从第n字段开始,m字段结束(默认到行尾)

#uniq命令是用来取消重复行的命令,其实和“sort-u”选项是一样的。
[root@localhost~]# uniq	[选项]	文件名
-i:忽略大小写

#wc
[root@localhost~]# wc	[选项]	文件名
-l:只统计行数
一w:只统计单词数
-m:只统计字符数

3.条件判断

1、按照文件类型判断

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

测试选项作用
-b 文件判断该文件是否存在,并且是否为块设备文件(是块设备文件为真)
-c文件判断该文件是否存在,并且是否为字符设备文件(是字符设备文件为真)
-d 文件判断该文件是否存在,并且是否为目录文件(是目录为真)
-e文件判断该文件是否存在(存在为真)
-f 文件判断该文件是否存在,并且是否为普通文件(是普通文件为真)
-L文件判断该文件是否存在,并且是否为符号链接文件(是符号链接文件为真)
-p文件判断该文件是否存在,并且是否为管道文件(是管道文件为真)
-s文件判断该文件是否存在,并且是否为非空(非空为真)
-S文件判断该文件是否存在,并且是否为套接字文件(是套接字文件为真)

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

[root@localhost~]#[ -w student.txt ] && echo “yes” ll echo “no”

测试选项作用
-r文件判断该文件是否存在,并且是否该文件拥有读权限(有读权限为真)
-w文件判断该文件是否存在,并且是否该文件拥有写权限(有写权限为真)
-x文件判断该文件是否存在,并且是否该文件拥有执行权限(有执行权限为真)
-u文件判断该文件是否存在,并且是否该文件拥有SUID权限(有SUID权限为真)
-g 文件判断该文件是否存在,并且是否该文件拥有SGID权限(有SGID权限为真)
-k文件判断该文件是否存在,并且是否该文件拥有SBit权限(有SBit权限为真)

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

[root@localhost~]# [ /root/student.txt -ef /tmp/stu.txt ] && echo “yes” || echo “no”

测试选项作用
文件1 -nt 文件2判断文件1的修改时间是否比文件2的新(如果新则为真)
文件1 -ot 文件2判断文件1的修改时间是否比文件2的旧(如果旧则为真)
文件1 -ef文件2判断文件1是否和文件2的Inode号一致,可以理解为两个文件是否为同一个文件。这个判断用于判断硬链接是很好的方法

4、两个整数之间比较

[root@localhost~]# [23 -le 22 ] && echo “yes” ll echo “no”

测试选项作用
整数1 -eq整数2判断整数1是否和整数⒉相等(相等为真)
整数1 -ne整数⒉判断整数1是否和整数⒉不相等(不相等为真)
整数1 -gt整数⒉判断整数1是否大于整数⒉(大于为真)
整数1-lt整数⒉判断整数1是否小于整数2(小于位置)
整数1 -ge整数⒉判断整数1是否大于等于整数2(大于等于为真)
整数1 -le整数⒉判断整数1是否小于等于整数2(小于等于为真)

5、字符串的判断

[root@localhost ~]#name=sc
[root@localhost ~]# [ -z “$name” ] && echo “yes” ll echo “no”

测试选项作用
-z字符串判断字符串是否为空(为空返回真)
-n字符串判断字符串是否为非空(非空返回真)
字串1==字串2判断字符串1是否和字符串2相等(相等返回真)
字串1 !=字串2判断字符串1是否和字符串2不相等(不相等返回真)

6、多重判断

[root@localhost ~]#aa=11

[root@localhost~]# [ -n “ a a " − a " aa" -a " aa"a"aa”-gt 23 ] && echo “yes” |l echo “no”

测试选项作用
判断1 -a 判断2逻辑与,判断1和判断⒉都成立,最终的结果才为真
判断1 -o判断2逻辑或,判断1和判断2有一个成立,最终的结果就为真
!判断逻辑非,使原始的判断式取反

4.流程控制

1、if条件判断

if条件判断[ 条件 ]必须有空格

####单if
if	[ 条件判断式 ]; then
	程序
fi
####双分支if语句
if	[ 条件判断式 ]
	then
		条件成立时,执行的程序
	else
		条件不成立时,执行的另一个程序
fi
######多分支if语句
if	[ 条件判断式1 ]
    then
		当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
	then
		当条件判断式2成立时,执行程序2
…省略更多条件…
else
	当所有条件都不成立时,最后执行此程序
fi

2、多分支case条件语句

case $变量名 in
	"值1")
		如果变量的值等于值1,则执行程序1
		;;
	"值2")
		如果变量的值等于值2,则执行程序2
		;;
…省略其他分支…
*)
	如果变量的值都不是以上的值,则执行此程序
	;;
esac

3、for循环

#####语法一
for变量in值1值2值3…
	do
		程序
	done
#####语法二,注意空格
for(( 初始值;循环控制条件;变量变化 ))
	do
		程序
	done

4、while和until循环

### while循环
while [ 条件判断式 ]
	do
		程序
	done
### until循环,和while循环相反,until循环时只要条件判断式不成立则进行循环,并执行循环程序。一旦循环条件成立,则终止循环。语法如下:
until [ 条件判断式 ]
	do
		程序
	done

5、函数

function 函数名(){
	程序
	echo ""/return 1
}
a=`函数名`

6、特殊流程控制

exit [返回值],退出当前脚本,不再执行,返回值可通过预定义上一次执行结果$?查看返回值

break:结束当前循环

continue:跳出当前循环,继续下一次循环

学习路径:https://space.bilibili.com/302417610/,如有侵权,请联系q进行删除:3623472230

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值