linux系统学习(11、shell编程)
目录
一、正则表达式
(1)基本的正则表达式
(2)使用方法
二、字符串截取命令
1.cut命令
(1)概述
(2)示例
2.printf命令
(1)概述
(2)示例
3.awk命令
(1)概述
(2)示例
(3)BEGIN
(4)FS内置变量
(5)END
(6)关系运算符
4.sed
(1)概述
(2)常见用法
Ⅰ:打印指定行
Ⅱ:删除指定行数据
Ⅲ:追加
Ⅳ:替换
三、字符串处理命令
1.sort
(1)sort直接排序,对每行排序,按照字母表顺序a-z
(2)sort -r 按照字母表反向排序z-a
(3)指定分隔符,按照行内的某些元素排序
(4)指定为数值类型 -n
2.wc
(1)基本概念
(2)实操
四#条件判断
1.按照文件类型进行判断
2# 按照文件权限进行判断
3.两个文件之间进行比较
4.两个整数进行比较
5.字符串的判断
6.多重条件判断
五.流程控制语句
1.if语句
(1).单支if条件语句
(2)双分支if语句
(3)多分支if语句
2.case语句
3.for循环
(1)语法1
编辑
(2)语法2
编辑
4.while循环和until循环
(1)while循环
(2)until循环
下面的所有处理都是以行为单位的,无论是正则匹配,还是字符串操作,还是排序。
一、正则表达式
(1)基本的正则表达式
和python没什么区别

(2)使用方法
直接是grep + 正则表达式 + 文件, 之后按照每行匹配,将匹配满足的行输出。

二、字符串截取命令
1.cut命令
(1)概述
他的局限在于,如果有很多空格,他就分隔不了了。比如有的列是三个空格,有的列是两个空格,如果还是按照空格分隔会很奇怪。

(2)示例
提取文件中的某些列

2.printf命令
(1)概述
其实前面的n不经常用,啊哈哈哈哈哈。因为我们输出的时候,会多写几个 %s。
后面不能跟文件,只能是文件的内容。

(2)示例
他的这个输出是默认没有格式的,需要自己添加格式,他是凝成一坨输出。
自己输出格式顶多也就是\t和\n了。


3.awk命令
(1)概述
awk什么也不写的情况下,默认对每行按照空格和制表符进行分割,之后可以使用$加数字表示第几列。
如果没有条件,那么对全部文件进行操作。
主要作用是对cut的补充。

(2)示例
Ⅰ:输出指定的一些列

(3)BEGIN
下面这个表示BEGIN表示在所有的数据读入之前执行的动作,也就是打印******。


(4)FS内置变量
作用是指定分隔符。下面这个代码是,默认akw按照空格和制表符分隔,现在按照冒号分隔。这个前面必须要有BEGIN。否则第一行的数据还是默认按照空格分隔。


(5)END
最后执行的操作。

(6)关系运算符


4.sed
(1)概述
它可以处理流结构。也就是说可以直接对命令的输出进行进一步的处理。



(2)常见用法
Ⅰ:打印指定行
这里可以看出加不加n的区别,加n他就只打印第二行,不加n他就顺便把所有的表格再打印一遍。

Ⅱ:删除指定行数据
下面就是删除2,3行的数据

Ⅲ:追加
包括行后追加和行前插入。


Ⅳ:替换
包括按行替换和按字符串替换



最后对于上面的所有操作,如果加上i,那么就可以将更改保存到原来的文件中。
三、字符串处理命令
1.sort

(1)sort直接排序,对每行排序,按照字母表顺序a-z

(2)sort -r 按照字母表反向排序z-a
(3)指定分隔符,按照行内的某些元素排序
-t ":" 表示以:为分隔符。 -k表示分割后的第几列,后面的两个3表示作用域的开始和结束。如果只有一个,那么默认到最后
sort -t ":" -k 3,3 /ect/passwd

(4)指定为数值类型 -n
对于上面的例子,第三行他会把1拍到最前面,他不会考虑121 比 2 大, 因为第一个是1,所以还是排在前面,如果我们想要通过数值比较,那么需要-n。

2.wc
(1)基本概念

(2)实操

四#条件判断
1.按照文件类型进行判断


&& 表示前面的指令执行成功后后面的才会执行
总体表示存在/root输出yes,否则输出no
注意判断语句前后都有空格。
[ -d /root ] && echo "yes" || echo "no"

2# 按照文件权限进行判断
但是不能判断是不是用户组,还是用户权限,只要三大权限有一个满足,就算判断成功。


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


对于-ef的这个办法,常用于判断两个文件是否一样。因为硬连接的话,两个文件名可以不同,这个时候可以使用。

4.两个整数进行比较


5.字符串的判断

注意这个赋值的等号不能有空格。

6.多重条件判断


五.流程控制语句
1.if语句
(1).单支if条件语句
我一般使用第二种,啊哈哈哈哈

#!/bin/bashrate=$(df -h | grep "/dev/nvme0n1p8" | awk '{print $5}' | cut -d "%" -f1)if [ $rate -ge 8 ]thenecho "warning"fi

(2)双分支if语句

(3)多分支if语句

2.case语句

#!/bin/bashread -p "Please choose yes/no" -t 30 chocase $cho in "yes")echo "Your choose yes";;"no") echo "Your choose no";;*) echo "Your choose is error";;
esac

3.for循环
(1)语法1

#!/bin/bashfor num in 1 2 3 4 5doecho $numdone
他的更多的体现在批量话的功能,比如下面;批量解压文件
> 表示追加
>> 表示覆盖
&> 表示将标准输出和错误输出不使用命令行输出,输出大/dev/null
/de/null 是一个回收站,放到这里的东西不会在磁盘上有残留。

(2)语法2

注意
| 写法 | 语法类型 | 用途 | 是否正确(算术运算场景) |
|---|---|---|---|
s=$(($s + $i)) | 算术扩展 | 进行整数算术运算 | 正确 |
s=$($s + $i) | 命令替换 | 执行系统命令并获取输出 | 错误(无法用于算术运算) |
如果需要在 Shell 中进行算术运算,务必使用 $((...)) 语法;$(...) 仅用于执行外部命令,不可混淆。
#!/bin/bash
s=0
for((i=0;i<=100;i=i+1))dos=$(($s+$i))done
echo $s
4.while循环和until循环
(1)while循环

#!/bin/bash
s=0
i=1
while [ $i -le 100 ]dos=$(($s+$i))i=$((1+$i))done
echo $s
(2)until循环
#!/bin/bash
s=0
i=1
until [ $i -ge 101 ]dos=$(($s+$i))i=$((1+$i))done
echo $s



