Shell基础之正则表达式

一、基础正则表达式

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命令中支持printfprint命令
    • 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
发布了74 篇原创文章 · 获赞 3 · 访问量 4375

猜你喜欢

转载自blog.csdn.net/qq_40672635/article/details/105220534