shell脚本——正则表达式(包含grep详细介绍及应用)

Posted 0611#

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本——正则表达式(包含grep详细介绍及应用)相关的知识,希望对你有一定的参考价值。

正则表达式的作用

  • 正则表达式是一种字符模式,用于在查找过程中匹配指定的字符
  • 它将匹配被查找的的行中任何位置出现的相同模式,在正则表达式中,元字符是最重要的概念
  • 正则表达式能够被vimsedgrep调用
  • 正则表达式运用场景 mysql、oracle、php、Python、Apache、nginx

前言案例:使用^和$判断用户输入的是否是数字

read -p "输入数字才能退出:" num

if [[ $num =~ ^[0-9]+$ ]]     #我们需要掌握的就是正则表达式中的各种符号运用
        then
                echo "您输入的是数字"
        else
                echo "您输入的不是数字"
fi

基础正则表达式元字符

元字符作用
\\转义字符,用于取消特殊符号的含义,如:\\!、\\n等
^匹配字符串的开始位置,如:^world匹配以world开头的行
$匹配字符串的结束位置,如:world$匹配以world结尾的行
.匹配除\\n(换行)之外的任意一个字符
*匹配前面的子表达式0次或者多次
[list]匹配list列表中的一个字符,如:[0-9]匹配任一位数字
[^list]匹配不在list列表中的一个字符,如:[^0-9]匹配任意一位非数字字符
\\ {n \\ }匹配前面的子表达式n次,如:[0-9] \\ {2 \\ }匹配两位数字
\\ {n, \\ }匹配前面的子表达式不少于n次,如:[0-9]{2,\\ }表示两位及两位以上数字
\\ {n,m \\ }匹配前面的子表达式n到m次,如:[a-z]\\ {2,3 \\ }匹配两到三位的小写字母
  • 元字符是一类字符,他们表达的是不同于字面本身的含义
  • 中括号两边都不能空格

基础正则表达式元字符案例

一、^ 行首定位符

[root@pakho ~]# grep "^abc" zzbds.txt
abc

二、$ 行尾定位符

[root@pakho ~]# grep  "x$"  zzbds.txt
zabbix

三、. 匹配任意单个字符

[root@pakho ~]# grep "a.c" zzbds.txt
abc
javascript
adc

四、* 匹配前导符0到多次

*在字符右才有意义 修饰前方的字符 前方的字符叫前导符

[root@pakho ~]# grep "ab*" zzbds.txt
zabbix
abc
kali
javascript
adc
abcd
abcde
abcdef

五、.* 任意多个字符

为什么 *. 不好使因为 *是前导符

[root@pakho ~]# grep ".*" zzbds.txt
zabbix
abc
kali
centos
linux
ubuntu
python
docker
k8s
javascript

六、[ ] 匹配指定范围内的一个字符

[root@pakho ~]# grep "[lL]ove" zzbds.txt
love
Love
[root@pakho ~]# grep "[ilL]ove" zzbds.txt
love
Love
iove

七、[-]匹配指定范围内的一个字符,连续的范围

[root@pakho ~]# grep "[0-9]" zzbds.txt
k8s
1ove
[root@pakho ~]# grep "[a-z]ove" zzbds.txt
love
iove
[root@pakho ~]# grep "[a-Z]ove" zzbds.txt
love
Love
iove

八、[^] 匹配不在指定组内的字符

为什么会有数字的也被显示出来因为搜索命中了其他字符附带将数字带了出来

[root@pakho ~]# grep "[^0-9]" zzbds.txt
zabbix
abc
kali
centos
linux
ubuntu
python
docker
k8s
javascript
shell
adc
abcd
abcde
abcdef
love
Love
1ove
iove
[root@pakho ~]# grep "[^a-z]ove" zzbds.txt
Love
1ove

九、\\ 用来转义元字符 (") ("") (\\ ),脱意符

  • 一般情况下都用 " " 尽量不去使用 " 和 \\
  • \\ 只转意一个字符 转义右边的字符
[root@pakho ~]# grep "\\.ove" zzbds.txt
.ove

十、\\< 词首定位符

[root@pakho ~]# grep "\\<love" zzbds.txt
love
i love you
a love b
loveme
  • ^ 和 <的区别

十一、\\> 词尾定位符

  • 词尾定位符就不举例了用法和词首定位符差不多举一反三就好

十二、() 匹配稍后使用的字符的标签

  • 需求:准备了一个脚本需要给脚本第9行和第11行添加注释
#!/bin/bash
#****************
#Author:Pakho
#Date:2021-05-10
#FileName: shells.sh
#使用数组统计用户shell的类型和数量
#****************
declare -A shells                            #声明数组
while read ll                                #通过交互定义变量读取文件的内容定义给ll变量
        do
                type=`echo $ll | awk -F: '{print $7}'` #输出文件内容 -F:指定冒号分隔符
                let shells[$type]++                    #let变量运算 shells数组名称 $type 索引
        done  < /etc/passwd                            #使用文件里面的内容

for i in {!shelle[*]}          #!取反 使用索引进行循环         使用循环遍历数组
do
        echo " shell类型/索引 $i ; shell数量 ${shells[$i]} "#数组名称加索引看值
done
  • 命令如下
9,11 s/\\(.*\\)/#\\1/    #\\1 代表引用前方字符串

十三、x\\{m\\ } 字符x重复出现m次

[root@pakho ~]# grep "w\\{5\\}"  zzbds.txt
wwwwwqqqqq

十四、x\\{m,\\ }字符x重复出现m次以上

[root@pakho ~]# grep "q\\{3,\\}"  zzbds.txt
wwwwwqqqqq

十五、x\\{m,n\\ }字符x重复出现m到n次

[root@pakho ~]# grep "q\\{3,4\\}"  zzbds.txt  #仅匹配3到4次第5个不算
wwwwwqqqqq

扩展正则表达式元字符

元字符作用
+匹配1~n个前导字符
匹配0~1个前导字符
a I b匹配a或b
()组字符

扩展正则表达式元字符案例

扩展元字符需要使用 egrep

案例文本

[root@pakho ~]# vim 1.txt
lve
love
loove

一、+ 匹配1~n个前导字符

[root@pakho ~]# egrep lo+ve 1.txt
love
loove

二、? 匹配0~1个前导符

[root@pakho ~]# egrep lo?ve 1.txt   #lo?ve 前面的o有没有都行
lve
love

三、a|b 匹配 a 或 b

[root@pakho ~]# egrep "d|g" 1.txt
bvgftywquhjfqw
hgcydwquijkngrw4
nqwugehqr

四、() 组字符

案例文本

[root@pakho ~]# vim 2.txt
rs
loveable
lovers
[root@pakho ~]# egrep "love(able|rs)" 2.txt
loveable
lovers

正则表达式元字符综合案例

示例

^$                              #空行
^[A-Z]..$                       #开头一个大写,最后两个任意字符
^[A-Z][a-z]*3[0-5]		        #开头一个大写,0到多个小写,3最后是0-5的一个数字
 [a-z]*\\.                       #0到多个小写字母最后一个点
^ *[A-Z][a-z][a-z]$             #0到多个空格开头一个大写一个小写再以一个小写结尾 
^[A-Za-z]*[^,][A-Za-z]*$		#0到多个字母开头,但不是逗号,0到多个字母结尾
\\<fourth\\>				        #找个单词
\\<f.*th\\>				        #找个单词
5{2}2{3}\\.				        #两个五  三个二最后一个点
^[ \\t]*$				        #0到多个空格或tab的行
^# 						        #以#开头的注释行
^[ \\t]*#				        #0到多个空格或者tab开头的注释行
:1,$ s/\\([Oo]ccur\\)ence/\\1rence/  

三剑客grep详解

  • grep搜索指定的输入文件(如果没有指定文件,或者如果文件名中有一个连字符减号(-),则搜索标准输入)中的行包含与给定模式匹配的。默认情况下,grep打印匹配行
  • 此外,还提供了两个变体程序egrep和fgrep。egrep与grep-E相同。fgrep与grep-F相同。直接调用因为不推荐使用egrep或fgrep,但提供它是为了允许依赖它们的历史应用程序不经修改地运行

grep的分类

  • grep
  • egrep
  • fgrep

grep的返回值

  • 0 :表示成功
  • 1 :表示所提供的文件无法找到匹配的pattern
  • 2 :表示查找地点不对

grep的参数

  • grep -q :静默,常用于判断
[root@pakho ~]# grep -q "root" /etc/passwd
[root@pakho ~]# echo $?
0
  • grep -v :取反
[root@pakho ~]# ps aux | grep ssh | grep -v grep
  • grep -R:可以查看目录下的内容
[root@pakho ~]# grep 123 -R abc
abc/1.txt:123
  • grep -o:只找到这个关键字就可以
[root@pakho ~]# grep -o "root" /etc/passwd
root
root
root
root
root
  • grep -B2:查看文件的前两行
  • grep -A2:查看文件的后两行
  • grep -C2:查看文件上下两行

egrep示例

#grep -E 或 egrep进行使用
egrep "NW" datafile.txt            #查找文件内是否有NW
egrep "NW" d*.txt				   #不知道文件名就想查找文件内有NW的文件
egrep "^n" datafile.txt			   #查找文件以n开头的行
egrep "4$" datafile.txt 		   #查找以4结尾的行
egrep "TB Savage" datafile.txt     #在文件中查找TB savage这个词组
egrep "5\\.." datafile.txt          #找5 5后面带一个点 点后面是任意字符
egrep "\\.5"  datafile.txt 		   #找.5
egrep "^[we]" datafile.txt         #找w或者e开头的行
egrep "[^0-9]" datafile.txt        #除了数字都能找到
egrep "[A-Z][A-Z] [A-Z]" datafile.txt #查找大写字母大写字母 空格大写字母
egrep "ss*" datafile.txt           #查找一个s和0至多个s
egrep "[a-z]{9}" datafile.txt      #查找一个小写字母出现9次
egrep "\\<north" datafile.txt       #查找一个词是以north开头
egrep "\\<north\\>" datafile.txt     #找个词
egrep "\\<[a-r].*n\\>" datafile.txt  #a-r中间一个开头 0到多个任意字符 n结尾

以上是关于shell脚本——正则表达式(包含grep详细介绍及应用)的主要内容,如果未能解决你的问题,请参考以下文章

13 shell脚本--005grep和正则表达式

shell脚本应用正则表达式grep,sed,awk,的应用

shell脚本应用正则表达式grep,sed,awk,的应用

shell脚本之正则表达式

shell脚本之正则表达式

正则表达式详细介绍