Linux正则表达式与通配符

Linux正则表达式与通配符,第1张

正则表达式:在计算机科学中,是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。在很多文本编辑器或其他工具里,正则表达式通常被用来检索或替换那些符合某个模式的文本内容。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。

只有掌握了正则表达式,才能全面地掌握 Linux 下的常用文本工具(例如:grep、egrep、GUN sed、 Awk 等) 的用法

grep、sed、awk天然支持正则

grep -v代表反选,反向选择匹配到的内容

grep -E代表使用扩展正则

grep -P代表使用Perl正则

sed -r 代表使用扩展正则

正则表达式分为三类(man grep可以看到,分别是basic RegExs,extended RegExs,perl RegExs)

1、基本的正则表达式(Basic Regular Expression 又叫 Basic RegEx 简称 BREs)

2、扩展的正则表达式(Extended Regular Expression 又叫 Extended RegEx 简称 EREs)

3、Perl 的正则表达式(Perl Regular Expression 又叫 Perl RegEx 简称 PREs)

b. 处理过程:查找文本文件中是否包含要查找的 “关键字”(关键字可以是正则表达式) ,默认返回匹配的该行的内容

c. grep|egrep处理文件时,按行处理 |

| sed | sed | sed -r | - | a. 处理对象:文本文件

b.处理 *** 作:对文本文件的内容进行 查找、替换、删除、增加等 *** 作

c. sed 在处理文本文件的时候,按行处理 |

| awk | - | awk | - | a. awk 处理的对象:文本文件

b. awk 处理 *** 作:主要是对列进行 *** 作 |

注意:egrep 或 sed -r 默认使用扩展正则表达式(EREs),一般特殊字符({})可以不转义

grep -E 以及egrep(Extend Regular Expression)

Linux通配符和三剑客的正则表达式是不一样的,因此,代表的意义也有较大的区别

通配符一般用户命令行bash环境,而linux正则表达式用于grep, sed, awk场景。

通配符说明

示例:* 的使用:代表任意0-N个字符,代表所有字符

    01 系统特殊符号

    02 系统通配符号

    03 系统正则符号

    说明: 查询信息的时候,会带来便利

    1) 基础符号系列

      $ 

      a 调取变量信息

      b 区分用户类型  $ 普通用户

      c 结合awk对文件进行取列  

    xargs -n 2 <test01.txt|awk '{print $2}'

  !

  a 强制的作用  wq!

  b 可以实现取反

awk '!/oldgirl/' test02.txt (排除oldgirl)

find /oldboy_dir/ ! -type f (排除文件)

  c !信息  可以快速调取执行历史命令(慎用)

    cat ~/.bash_history  -- 记录历史命令信息, 但是不会实时记录

history              -- 显示所有输入过的历史命令

      |

  a 实现管道功能

    将前一个命令执行的结果交给管道后面的命令进行处理

一般管道符号 会经常和xargs命令配合使用

批量删除 *** 作

find /oldboy -type f -name "oldboy*.txt"|xargs rm

find /oldboy_dir/ -type f -delete

    find /oldboy_dir/ -type f -exec rm -f {} \

    查找指定数据信息进行复制

    find /oldboy -type f -name "oldboy*.txt" |xargs -i cp {} /oldgirl/

    find /oldboy -type f -name "oldboy*.txt" |xargs cp -t /oldgirl/

    find /oldboy -type f -name "oldboy*.txt" -exec cp -a {} /oldgirl \

查找指定数据信息进行移动

    find /oldboy -type f -name "oldboy*.txt" |xargs -i mv {} /oldgirl/

    find /oldboy -type f -name "oldboy*.txt" |xargs mv -t /oldgirl/

    find /oldboy -type f -name "oldboy*.txt" -exec mv {} /oldgirl \

    xargs(火眼金睛)后面跟的命令,不识别别名信息

  #

    a 表示对配置文件信息进行注释

    b 表示用户的身份信息 超级管理员用户

2) 引号符号系列

      "" 基本上和单引号功能类似 但是可以对一些特殊符号做出解析  $ `命令`==$(命令)

      '' 里面编写的什么内容就输出什么内容  所见即所得

  作用:

  01. 指定需要输出的信息

  02. 利用引号将空格分隔的信息汇总为一个整体

      ``($()) 将引号里面命令执行结果,交给引号外面命令进行使用  

3) 重定向符号

  >/1>  标准输出重定向符号

  >>/1>> 标准输出追加重定向符号

  2> 错误输出重定向符号

  2>> 错误输出追加重定向符号

  <  标准输入重定向符号

      tr xargs

  <<标准输入追加重定向符号

4) 逻辑符号系列

  逻辑: 在完成一件事情的时候,有合理先后顺序

  &&  前一个命令 *** 作执行成功了,再 *** 作执行后面的命令

  ||  前一个命令 *** 作执行失败了,再 *** 作执行后面的命令

  mkdir /old_dir &&echo "create dir sucess" || echo "create dir failed"

      create dir sucess

      mkdi /old_dir &&echo "create dir sucess" || echo "create dir failed"

      -bash: mkdi: command not found

      create dir failed

    什么通配符号: 用于匹配文件名称信息, 便于快速查找文件信息 find

    *  匹配所有信息

      find /oldboy -type f -name "oldboy*"  ---以oldboy开头的信息都查询出来

  find /oldboy -type f -name "*oldboy"  ---以oldboy开头的信息都查询出来

  find /oldboy -type f -name "oldgirl*oldboy" 

                                          ---以oldgirl 开头的信息

    以oldboy  结尾的信息都查询出来

{} 产生序列信息

  连续序列:

    echo {01..05}

        echo {a..z}

        echo {A..Z}

  生成不连续序列

  a 有规律的不连续序列

echo {01..05..2}

        01 03 05

        echo {a..z..2}

      b 没规律的不连续序列

echo {www,bbs,blog}

        www bbs blog

  生成组合序列

        echo {1,2}{a,b}

        1a 1b 2a 2b

        echo {1,2}{a,b}{A,B}

        1aA 1aB 1bA 1bB 2aA 2aB 2bA 2bB

    echo A{a,b}

        Aa Ab  

      A=oldboy.txt

      echo oldboy.txt{a,b}  

      oldboy.txta oldboy.txtb  

  echo A{,b}

      A Ab

  A=oldboy.txt

  b=.bak

  cp oldboy.txt{,.bak} == cp oldboy.txt oldboy.txt.bak

  快速备份文件命令

  cp oldboy.txt{,.bak}

  快速还原数据方法

  cp oldboy.txt{.bak,}

  echo A{B,}

      AB A

  oldboy.txt{.bak,} == cp oldboy.txt.bak oldboy.txt

    基础正则符号:basic regular expression    (BRE)

扩展正则符号:extended regular expression (ERE)

基础正则符号:

    a 尖角符号:^

      以什么开头的信息进行过滤出来

  grep -v "^#" nginx.conf.default >nginx.conf(对不需要关注的信息取反)

  常见错误

  find / -type f -name "^oldboy"  错误

  find / -type f -name "oldboy*"  正确

    b 美元符号:$

  以什么结尾的信息进行过滤出来

  以m结尾信息, 并且显示上1行 和 下2行的信息

      grep "m$" -A 2 -B 1 test.txt

      常见错误:

  如果过滤不出来,确认每行结尾是否有空格信息

  方法一:

  cat -A test.txt

  方法二

      vim 底行模式输入命令 --- :set list

c 尖角美元符号:^$

      取出文件中空行信息

      grep "^$" test.txt

      grep -v "^$" test.txt

d 点符号: .

  表示匹配任意一个且只有一个字符

  grep "." test.txt  -o(更直观的显示过程)

e 星号符号: *

  匹配星号前面一个字符连续出现0次或多次

f 点和星号组合: .*

      匹配所有信息

  说明: 正则符号在匹配数据信息的时候具有贪婪特性

避免贪婪特性的方法,是在指定一行信息中唯一节点信息

g 转译符号: \

1) 将一些有意义的符号进行转译, 变为一个普通符号

grep "\.$" ~/oldboy_test.txt

2) 将一些没有意义的符号进行转译,变为有意义符号

    \n  换行符号 linux

    3) 可以将扩展正则符号转换成普通正则让grep sed命令可以直接识别'

grep "o\?" test.txt

h 括号符号:[]

  匹配括号中每一个字符,并且匹配的关系是或者的关系

  需求: 找出文件中oldboy 和 oldbey两个单词信息

      grep "oldb[oe]y" test.txt

      企业应用: 找寻文件中字母 数字信息

      grep "[0-9a-zA-Z]" test.txt

i 尖号和中括号组合使用 : [^]

  对中括号里面匹配的字符信息进行排除

  grep  "[^0-9a-zA-Z]" test.txt  --- 将字母数字都排除,只留下符号信息

  尖号和中括号组合使用 : ^[]

  以中括号里面匹配的字符作为一行开头的字符

      grep "^[zx]" test.txt

正则符号注意事项

按照每行信息进行过滤处理

注意正则表达符号禁止中文

附上颜色信息进行正则过滤 --color=auto/--color

基础正则符号可以被三剑客命令直接识别 grep sed awk

扩展正则符号不可以被三剑客命令中老二和老三直接识别

sed命令想识别正则符号: sed -r

grep命令想识别正则符号: egrep / grep -E

    a 加号符号:+

    匹配加号前面一个字符连续出现1次或者多次

b 竖线符号:|

或者关系符号

egrep "oldboy|oldbey" test.txt

c 括号符号:()

将多个字符信息进行汇总为一个整体

egrep "(oldboy)" test.txt

进行后向引用前向的一个 *** 作(sed)

echo "123456"|sed -r "s#(..)(..)(..)#<\1><\2><\3>#g"

修改配置文件内容

sed -rn "s#(^S.*UX=).*#\1enforcing#gp" /etc/selinux/config

SELINUX=enforcing

d 括号符号:{}

指定花扩号前一个字符连续匹配多少次

* 连续匹配 0 次 或 多次

+ 连续匹配 1 次 或 多次

    1) {n,m}  n表示最少连续匹配多少次  m表示最多连续匹配多少次

2) {n}  n表示只连续匹配n次

3) {n,}  n表示至少连续匹配n次,至多没有限制

4) {,m}  m表示至多连续匹配n次,至少0次

e 问号符号:?

  表示匹配问号前面一个字符出现0次或者1次


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7533353.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-06
下一篇 2023-04-06

发表评论

登录后才能评论

评论列表(0条)

保存