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的条件
例如:
[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