一、基础正则表达式
1、正则表达式与通配符
-
正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配。grep、awk、sed等命令可以支持正则表达式
-
通配符用来匹配符合条件的文件名,通配符是完全匹配(必须一摸一样才显示。ls、find、cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配
-
基础正则表达式
元字符 | 作用 |
---|---|
* | 前一个字符匹配0次或任意多次 |
. | 匹配除了换行符外任意一个字符 |
^ | 匹配行首(以xxx开头的行 |
$ | 匹配行尾 |
[] | 匹配中括号中指定的任意一个字符,只匹配一个字符 |
[^] | 匹配除中括号的字符以外的任意一个字符。 |
\ | 转义符。用于取消将特殊符号的含义取消 |
{n} | 表示其前面的字符恰好出现n次 |
{n,} | 表示其前面的字符出现不小于n次 |
{n,m} | 表示其前面的字符至少出现n次,最多出现m次 |
- 例子,grep “a” test.txt 匹配所有内容,包括空白行。grep “aa” test.txt,匹配至少包含一个a的行
- .例子,grep “s…d” test.txt 匹配s和d间有两个字符的单词,grep “s.d” test.txt 匹配s和d字母之间有任意字符 。grep “.” test.txt 匹配所有内容
- ^$例子
grep “^M” test.txt
匹配以M开头的行。grep “n$” test.txt
匹配以n结尾的行grep -n “^$” test.txt
匹配空白行。
- []例子
- [aoeiu]匹配任意一个元音字母
- [0-9]匹配任意一位数字
- [a-z][0-9]匹配小写字和一位数字构成的两位字符
[^]
例子[^0-9]
匹配任意一个非数字字符[^a-z]
匹配任意一位非小写字母^[^a-zA-Z]
匹配不用字母开头的行
- \例子
grep “\.$” test.txt
匹配使用.结尾的行,因为.在正则中是有含义的,所以有\使得.失去含义
- {n}例子,[0-9]{\4} 匹配4位数字,[1][3-8][0-9]{9}匹配手机号码
- {n,}例子,[0-9]{2,}匹配两位及以上的数字
- {n,m}例子,[a-z]{6,8}匹配6到8位的小写字母
二、字符截取命令
1、cut命令
- 命令语法:
cut [选项] 文件名
- cut命令的局限:不能处理带空格的内容,必须是Tab键
选项 | 功能 |
---|---|
-f | 列号:提取第几列 |
-d | 分隔符,按照指定分隔符分割列 |
2、printf命令
命令语法:printf ‘输出类型输出格式’ 输出内容
输出格式 | 功能 |
---|---|
\a | 输出警告音 |
\b | 输出退格键(Backspace |
\f | 清除屏幕 |
\n | 换行 |
\r | 回车(enter |
\t | 水平输出退格键(Tab |
\v | 垂直输出退格键(Tab |
输出类型 | 功能 |
---|---|
%ns | 输出字符串,n是数字指代输出几个字符 |
%ni | 输出整数,n是数字指代输出几个数字 |
%m.nf | 输出浮点数。m和n是数字,指代输出的整数位数和小数位数 |
如%8.2f代表输出8位数,2位是小数,6位是整数。
3、awk命令
- awk命令中支持printf和print命令
- print:会在每个输出之后自动加入一个换行符(Linux默认没有print命令
- printf:标准格式输出命令
- 可以处理带空格的文件(相较cut的优势
- 命令语法:
awk’条件1{动作1}条件2{动作2}...’文件名
条件 | 判断变量x是否 |
---|---|
x>10 | 大于10 |
x>=10 | 大于等于 |
x<=10 | 小于等于 |
动作 |
---|
格式化输出 |
流程控制语句 |
-
BEGIN:
awk ‘BEGIN{...............}文件名’
在动作执行前,先执行 -
END:
awk ‘END{.......}文件名’
在所有动作执行完之后
4、sed命令
- sed是一种几乎包括所有UNIX平台(包括Linux)的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令
- 可以从管道符接受数据,然后直接对数据进行操作,不需要先把命令获取到的内容写入文件,再进行操作
- 命令语法:`sed[选项]’[动作]’文件名`
| 选项 | 功能 |
| --- | --- |
| -n | 一般sed命令会把所有数据都输出到屏幕,加入-n,只会输出sed处理之后的行 |
| -e | 允许对输入数据应用多条sed命令编辑 |
| -i | 用sed的修改结果直接修改读取数据的文件,而不是由屏幕输出 |
| 动作 | 功能 |
| — | — |
| a\ | 追加,再当前行后添加一行或多行,添加多行时,除最后一行外,每行末尾需要用\代表数据未完结 |
| c\ | 行替换,用c后面的字符串替换原数据行 替换多行 \ 代表数据未完结 |
| i\ | 插入,在当前行前插入一行或多行。插入多行时,除最后一行外,每行末尾需用\代表数据未完结 |
| d | 删除指定行 |
| p | 打印指定行 |
| s | 字串替换,用一个字符串替换另一个字符串行范围s/旧字串/新字串/g
|
三、字符处理命令
1、排序命令sort
-
命令语法:
sort[选项]文件名
-
最多用法还是直接sort不加选项
| 选项 | 功能 |
| — | — |
| -f | 忽略大小写 |
| -n | 以数值型进行排序,默认使用字符串型排序 |
| -r | 反向排序 |
| -t | 指定分隔符,默认分隔符是制表符 |
| -k n[,m] | 按照指定的字段范围排序。从n到m字段 |
2、统计命令wc
-
命令语法:
wc[选项]文件名
|选项 | 功能 |
| — | — |
| -l | 只统计行数 |
| -w | 只统计单词数 |
| -m | 只统计字符数 |
四、条件判断
1、按照文件类型进行判断
测试选项 | 作用 |
---|---|
-b文件 | 判断该文件是否存在,并且是否为块设备文件(是块设备文件为真 |
-c文件 | 判断该文件是否存在,并且是否为字符设备文件(是字符设备文件为真 |
-d文件 | 判断该文件是否存在,并且是否为目录文件(是目录文件为真 |
-e文件 | 判断该文件是否存在(存在为真 |
-f文件 | 判断该文件是否存在,并且是否为普通文件(是普通文件为真 |
-L文件 | 判断该文件是否存在,并且是否为符号链接文件(是符号链接文件为真 |
-p文件 | 判断该文件是否存在,并且是否为管道文件(是管道文件为真 |
-s文件 | 判断该文件是否存在,并且是否为非空(非空为真 |
-S文件 | 判断该文件是否存在,并且是否为套接字文件(是套接字文件为真 |
2、两种判断格式
test -e /root/install.log
[ -e /root/install.log]
- 但是不会输出到屏幕上,必须
echo &?
查看上一条语句执行结果,才行 [-d/root]&& echo “yes” || echo “no”
第一个判断命令正确执行,则打印yes否则打no
3、按照文件权限进行判断
测试选项 | 作用 |
---|---|
-r文件 | 判断该文件是否存在,并且是否该文件拥有读权限(有读权限为真 |
-w文件 | 判断该文件是否存在,并且是否该文件拥有写权限(有写权限为真 |
-x文件 | 判断该文件是否存在,并且是否该文件拥有执行权限(有执行权限为真 |
-u | 判断该文件是否存在,并且是否该文件拥有SUID权限(有SUID权限为真 |
-g | 判断该文件是否存在,并且是否该文件拥有SGID权限(有SGID权限为真 |
-k | 判断该文件是否存在,并且是否该文件拥有SBit权限(有SBit权限为真 |
4、两个文件之间进行比较
测试选项 | 作用 |
---|---|
文件1 -nt 文件2 | 判断文件1的修改时间是否比文件2的新(如果新则为真 |
文件1 -ot 文件2 | 判断文件1的修改时间是否比文件2的旧(如果旧则为真 |
文件1 -ef 文件2 | 判断文件1是否和文件2的inode号一致 |
ef可以理解为两个文件是否为同一个文件,用于判断硬链接
5、两个整数之间比较
测试选项 | 作用 |
---|---|
整数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(小于等于为真) |
6、字符串的判断
测试选项 | 作用 |
---|---|
-z 字符串 | 判断字符串是否为空(为空返回真 |
-n 字符串 | 判断字符串是否为非空(非空返回真 |
字串1 == 字串2 | 判断字符串1是否和字符串2相等(相等返回真 |
字串1 != 字串2 | 判断字符串1是否和字符串2不相等(不相等返回真 |
7、多重条件判断
测试选项 | 作用 |
---|---|
判断1 -a 判断2 | 逻辑与,判断1和判断2都成立,最终结果才为真 |
判断1 -o 判断2 | 逻辑或,判断1和判断2有一个成立,最终的结果就为真 |
!判断 | 逻辑非,使原始判断式取反 |
五、流程判断
1、if语句
- 单分支if条件语句
[前后各有一个空格]
if [ 条件判断式 ];then
程序
fi
或者
if [ 条件判断式 ]
then
程序
fi
- 双分支if条件语句
if [ 条件判断式 ]
then
条件成立时,执行的程序
else
条件不成立时,执行的另一个程序
fi
- 多分支if条件语句
if [ 条件判断式 ]
then
当条件判断式1成立时,执行程序1
elif [ 条件判断式2 ]
then
当条件判断式2成立时,执行程序2
省略更多条件.....
else
当所有条件都不成立时,最后执行此程序
fi
2、case语句
- case语句只能判断一种条件关系
case $变量名 in
“值1”)
如果变量的值等于值1 ,则执行程序1
;;
“值2”)
如果变量的值等于值2,则执行程序2
;;
...省略其他分支...
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
3、for循环
- 语法1(不知道循环次数
for 变量 in 值1 值2 值3...
do
程序
done
- 语法2(类似c
for(( 初始值;循环控制条件;变量变化 ))
do
程序
done
4、while循环与until循环
while-条件循环
while [ 条件判断式 ]
do
程序
done
- until循环
- 只要条件判断式不成立,就进行循环,和while相反
until [ 条件判断式 ]
do
程序
done