shell 正则表达式RE 正则符号拓展源 以及脚本中的正则匹配 递归查找文件内容 sed过滤文件内容

目录

  • 正则表达式
  • 拓展元字符
  • 正则判断数据类型
  • 递归查找文件内容
  • sed 的使用

正则表达式

# 支持扩展正则表达式,即o{3}表示匹配3个字母"o"。
grep -E "o{3}"  /etc/passwd
# 指定使用Perl兼容的正则表达式,即\s表示匹配一个空格。
grep -P "\s" /etc/passwd
# \d表示匹配一个数字字符
grep -P "\d" /etc/passwd

================================================================================
#格式
grep {^{内容}}  {文件路径}

# 基本元字符

================================================================================

    
# 行首定位符
^{内容}

# 行尾定位符
{内容}$

# 点可以表示一个字符
{a.b}   可以匹配到  abc

# 前导字符 零到多次  这里是就是匹配a 零次 或者多次
{a*b}   可以匹配到  abc

# 中间任意字符
{a.*b}


# 按照范围去匹配
[afl]o  ao fo  lo

# 匹配到一个字符  这个字符是小写字母 或者  数字
[a-z0-9]

# 匹配到多个字符  这个字母是大写字符
[A-Z]

# 匹配到五个大写字母
[A-Z]{5}


# 尖号  在这里是取反的意思
[^afl]o


# 词首定位符
\<
\<love



# 词尾定位符
\>
love\>

拓展元字符

grep -E | egrep  两个命令都支持扩展元字符


# 匹配一个任意字符
.

# 匹配  零个或多个前导字符
*

# 匹配多个任意字符
.*
egrep r.*t /etc/passwd

# 匹配一个 或者多个签到多个
?
egrep va? /etc/passwd

# 匹配两个关键词
|
egrep 'root|bash' /etc/passwd

# 过滤组合
egrep a(b|c|d)
只能过滤出来  ab  ac  ad

# 过滤某个字符串重复 次数
egrep o{2} /etc/passwd


# 过滤某个字符串重复 次数
x{m,n}                  字符x重复m到n次

# 字符次数控制
x{m}                    字符x重复m次
o{5}
o{,3}					字符最多出现3次
x{m,}                   字符x重复至少m次
o{5,}					字符最少出现5次


# -v可以取反
grep -v "\<[A-Z]" a.tx

正则判断数据类型

  = {等于}  != {不等于} =~ {匹配}

注意 在脚本中判断某个便令的样式哈
read -p"请输入:" get_var
if [[  $get_var =~ ^[0-9]+$ ]]; then
    echo "变量是数字"
else
    echo "变量不是数字"
fi

# 判断一个数字
^[0-9]+$

# 判断一个浮点数
^[0-9]+\.[0-9]+$

# 匹配数字个数 为11位
^[0-9]{11}$

# 匹配一个域名
^[a-z0-9]+$\.[a-z]$


====================================================================================
# 判断一个数字是不是11位
num=1234567890

if [[  $num =~ ^[0-9]{11}$ ]]; then
    echo "变量是手机号码"
else
    echo "变量不是手机号码"
fi
====================================================================================
# 判断是不是一个域名
num=123dfs45.con:155

if [[  $num =~ ^[a-z0-9]+\.[a-z]+:[0-9]+$ ]]; then
    echo "yes"
else
    echo "no"
fi

递归查找文件内容

# -r 选项表示递归搜索 可以返回 文件路径和内容

grep  -r 'root' /etc/  

# -o 选项表示只输出匹配行的内容,即不包含文件名和行号

grep  -r -o 'root' /etc/

# 把正则符号当作 字符串查询

grep -F '.*' /etc/  


##   ps 查找进程的 取消grep 取反
## 这样的作用是   在使用grep 查询某个进程的时候 可以 不看到grep 这个进程

ps aux | grep ssh | grep -v "grep"

sed 的使用

在工作环境中不要对 passwd 文件进行操作
此处仅仅作为一个演示

# -i可以对文件直接替换(-i 一定会替换)
sed -i "s/root/ROOT/g" /etc/passwd

# -r 是扩展元字符
sed -r "s/root/p" /etc/passwd

# -n 加上之后,只显示 查找的内容
sed -n "/root/p" /etc/passwd

# 对root 进行替换
sed "s/root/ROOT/g" /etc/passwd


# /root/d 删除带有root 的行
sed '/root/d' /etc/passwd


# 把带有root 的行 复制打印
sed '/root/p' /etc/passwd


# -n 会只输出 带有root 的行
sed -n '/root/p' /etc/passwd


# 对内容继续替换
sed "s/root/ROOT/g" /etc/passwd

================================================================================
# 对文件进行替换

## 永久关闭selinux

sed -r -i 's/^SELINUX=[a-z]+/SELINUX=disabled/' /etc/selinux/config

===============================================================================
'5d' 删除某行
'5p' 复制某行 带上参数 -n  可以只打印某几行
'^' 可以替换为一个内容 后边加上一个/n  就可以作为一个第一个行来用了

passwd  是一个复制过来的文件
    
# 删除 某行
	## 删除 第五行
sed "5d" passwd

# 删除 一到五行
sed "1,5d" passwd

# 删除 1 3  5 行
sed "1d;3d;5d" passwd


# 删除奇数行
sed "1~2d" passwd

# 删除偶数数行
sed "2~2d" passwd

===============================================================================
## 在某个内容 追加
i 是在上边插入  a 是在 后边追加

sed "/\[mysqld\]/a\innodb_buffer-pol_size = 128 M" /etc/my.cnf
\[mysqld\][mysqld]  内容后追加
/a  是在下边追加

# 在某行下边添加

sed  '8a hahaha' passwd

# 在某行上边添加
sed  '10i lalala' passwd

# 删除 注释和空行
sed -r '/#/d ; /^$/d' {文件路径}

# 把10行以后的末尾加上cloud:
sed '10,$ s/$/cloud/' passwd
	## 10,$ 表示 10行到最后
	## s/$/cloud/  表示把行尾替换为 cloud

# 显示包含oo字符串的行到包含gin字符串的行:
sed -n '/oo/,/gin/p' passwd

# 在文件第一行添加 11111  1s表示对第一行 进行操作。
sed '1s/^/11111\n/' passwd

# 删除10到20行最后一个字符:
sed -i '10,20s/.$//' passwd

# 打印第10 行到结尾
sed -i '10,$p' passwd

你可能感兴趣的:(shell脚本,sh)