zoukankan      html  css  js  c++  java
  • SHELL —— grep命令+正则表达式

    一 什么是正则

    正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法。或者说:正则就是用来描述一类事物的规则。
      生活中处处都是正则:
      比如我们描述:4条腿
      你可能会想到的是四条腿的动物或者桌子,椅子等
      继续描述:4条腿,活的
      就只剩下四条腿的动物这一类了

    在linux中,通配符是由shell解释的,而正则表达式则是由命令解释的,下面我们就为大家介绍grep文本处理命令,它也可以解释正则。

    二 grep

    参数

    -n  :显示行号
    -o  :只显示匹配的内容
    -q  :静默模式,没有任何输出,得用$?来判断执行成功没有,即有没有过滤到想要的内容

    -l  :如果匹配成功,则只将文件名打印出来,失败则不打印,通常-rl一起用,grep -rl 'root' /etc 
    -A  :如果匹配成功,则将匹配行及其后n行一起打印出来
    -B  :如果匹配成功,则将匹配行及其前n行一起打印出来
    -C  :如果匹配成功,则将匹配行及其前后n行一起打印出来
    --color
    -c  :如果匹配成功,则将匹配到的行数打印出来
    -E  :等于egrep,扩展
    -i  :忽略大小写

    -v  :取反,不匹配
    -w:匹配单词,单词的意思是特殊符号隔开的英文字母组合,对象中的正则表达式都会当成单词(前后有特殊符号)。

    [root@MiWiFi-R3-srv ~]# cat a.txt 
    root123
    ROot asdf
    Root_123
    rOOtss
    root 123
    [root@MiWiFi-R3-srv ~]# grep -i "root" a.txt 
    root123
    ROot asdf
    Root_123
    rOOtss
    root 123
    [root@MiWiFi-R3-srv ~]# grep -w "root" a.txt 
    root 123

    三 grep种类
    grep   全面搜索正则表达式并把行打印出来
    fgrep   它搜索字符串而不是搜索匹配表达式的模式。fgrep 命令使用快速的压缩算法。$, *, [, |, (, )等字符串被 fgrep 命令按字面意思解释。这些字符并不解释为正则表达式
    pgrep   以名称为依据从运行进程队列中查找进程,并显示查找到的进程id。
    egrep   用于在文件内查找指定的字符串。egrep执行效果与grep -E相似,使用的语法及参数可参照grep指令,与grep的不同点在于解读字符串的方法。

    四 正则介绍

    正则表达式

    描述

    示例

    Basic RegEx

    Extended RegEx

    Python RegEx

    Perl regEx

    转义符,将特殊字符进行转义,忽略其特殊意义

    a.b匹配a.b,但不能匹配ajb.被转义为特殊意义

    ^

    匹配行首,awk中,^则是匹配字符串的开始

    ^tux匹配以tux开头的行

    ^

    ^

    ^

    ^

    $

    匹配行尾,awk中,$则是匹配字符串的结尾

    tux$匹配以tux结尾的行

    $

    $

    $

    $

    .

    匹配除换行符 之外的任意单个字符,awk则中可以

    ab.匹配abcbad,不可匹配abcdabde,只能匹配单字符

    .

    .

    .

    .

    []

    匹配包含在[字符]之中的任意一个字符

    coo[kl]可以匹配cookcool

    []

    []

    []

    []

    [^]

    匹配[^字符]之外的任意一个字符(不匹配字符组内的每个字符)

    123[^45]不可以匹配1234123512361237都可以

    [^]

    [^]

    [^]

    [^]

    [-]

    匹配[]中指定范围内的任意一个字符,要写成递增

    [0-9]可以匹配123等其中任意一个数字

    [-]

    [-]

    [-]

    [-]

    ?

    匹配之前的项1次或者0

    colou?r可以匹配color或者colour,不能匹配colouur

    不支持

    ?

    ?

    ?

    +

    匹配之前的项1次或者多次

    sa-6+匹配sa-6sa-666,不能匹配sa-

    不支持

    +

    +

    +

    *

    匹配之前的项0次或者多次

    co*l匹配clcolcoolcoool

    *

    *

    *

    *

    ()

    匹配表达式,创建一个用于匹配的子串

    ma(tri)?匹配maxmaxtrix

    不支持

    ()

    ()

    ()

    {n}

    匹配之前的项n次,n是可以为0的正整数

    [0-9]{3}匹配任意一个三位数,可以扩展为[0-9][0-9][0-9]

    不支持

    {n}

    {n}

    {n}

    {n,}

    之前的项至少需要匹配n

    [0-9]{2,}匹配任意一个两位数或更多位数

    不支持

    {n,}

    {n,}

    {n,}

    {n,m}

    指定之前的项至少匹配n次,最多匹配m次,n<=m

    [0-9]{2,5}匹配从两位数到五位数之间的任意一个数字

    不支持

    {n,m}

    {n,m}

    {n,m}

    |

    交替匹配|两边的任意一项

    ab(c|d)匹配abcabd

    不支持

    |

    |

    |

    应用举例:

    .* 所有字符

    ^[^] 非字符组内的字符开头的行

    [a-z] 小写字母

    [A-Z] 大写字母

    [a-Z] 小写和大写字母

    [0-9] 数字

    < 单词头 单词一般以空格或特殊字符做分隔,连续的字符串被当做单词

    > 单词尾

    扩展正则 sed -r 参数 或转义

    grep -E egrep 或转义

     

    sed -n '/roo?/p' /etc/passwd 

    sed -rn '/roo?/p' /etc/passwd

    abc|def abcdef

    a(bc|de)f abcf adef

    x{m} x出现m

    x{m,} x出现m次至多次(至少m)

    x{m,n} x出现m次至n

    posix定义的字符分类

     

    [:alnum:] Alphanumeric characters.

    匹配范围为 [a-zA-Z0-9]

    [:alpha:] Alphabetic characters.

    匹配范围为 [a-zA-Z]

    [:blank:] Space or tab characters.

    匹配范围为 空格和TAB

    [:cntrl:] Control characters.

    匹配控制键 例如 ^M 要按 ctrl+v 再按回车 才能输出

    [:digit:] Numeric characters.

    匹配所有数字 [0-9]

    [:graph:] Characters that are both printable and visible. (A space is print-

    able, but not visible, while an a is both.)

    匹配所有可见字符 但不包含空格和TAB 就是你在文本文档中按键盘上能用眼睛观察到的所有符号

    [:lower:] Lower-case alphabetic characters.

    小写 [a-z]

    [:print:] Printable characters (characters that are not control characters.)

    匹配所有可见字符 包括空格和TAB

    能打印到纸上的所有符号

    [:punct:] Punctuation characters (characters that are not letter, digits, con-

    trol characters, or space characters).

    特殊输入符号 +-=)(*&^%$#@!~`|"'{}[]:;?/>.<,

    注意它不包含空格和TAB

    这个集合不等于^[a-zA-Z0-9]

    [:space:] Space characters (such as space, tab, and formfeed, to name a few).

     

    [:upper:] Upper-case alphabetic characters.

    大写 [A-Z]

    [:xdigit:] Characters that are hexadecimal digits.

    16进制数 [0-f]

     

    使用方法:

    [root@seker ~]# grep --color '[[:alnum:]]' /etc/passwd

    定义变量名的边界

    [root@MiWiFi-R3-srv ~]# rest_mem=20
    [root@MiWiFi-R3-srv ~]# echo ${rest_mem}%
    20%

    五 运算符

    算术运算符:+、-、*、/、%

    [root@MiWiFi-R3-srv ~]# echo $[3+1]
    4

    关系操作:与(())连用

    <    >     <=     >=     ==     !=     &&     ||

    test命令相关,[]可以达到一样的效果
    [root@MiWiFi-R3-srv ~]# x=1
    [root@MiWiFi-R3-srv ~]# [ $x -gt 1 ]
    [root@MiWiFi-R3-srv ~]# echo $?
    0

    赋值运算符

    =     +=     *=     /=     %=

    [root@MiWiFi-R3-srv ~]# x=10
    [root@MiWiFi-R3-srv ~]# ((x%3))
    [root@MiWiFi-R3-srv ~]# echo $x
    10
    [root@MiWiFi-R3-srv ~]# 
    [root@MiWiFi-R3-srv ~]# ((x%=3))
    [root@MiWiFi-R3-srv ~]# echo $x
    1

    shell里的所有计算器
    $[] (()) $(()) expr bc bc -l

    浮点运算:yum install bc -y

    [root@MiWiFi-R3-srv ~]# echo 'scale=2;1/3'|bc -l
    .33

    测试操作

    命令执行后会返回到一个系统变量中 $?
    如果$?值为0 表示命令执行成功 否则为失败

    测试命令 test [ ] [[ ]] (( ))
    打开man test 逐一介绍每个参数

    测试文件状态
    -d 目录
    -s 文件长度 > 0、非空
    -f 正规文件
    -w 可写
    
    -r 可读
    
    -x 可执行
    
    -L 符号连接
    
    -u 文件有 suid 位设置

    字符串测试

    = 两个字符串相等
    != 两个字符串不相等
    -z 空串
    -n 非空串
    
    [root@MiWiFi-R3-srv ~]# var1='abc'
    [root@MiWiFi-R3-srv ~]# var2='123'
    [root@MiWiFi-R3-srv ~]# [ $var1 == $var2 ]
    [root@MiWiFi-R3-srv ~]# echo $?
    1

    测试数值

    -eq 等于
    -ne 不等于
    -gt 大于
    -lt 小于
    -ge 大于等于
    -le 小于等于
    
    [root@MiWiFi-R3-srv ~]# [ 10000 -gt 250 ] #不要使用大于号小于号等于号等,要使用man test中规定的,详见下一小节4拓展
    [root@MiWiFi-R3-srv ~]# echo $?
    0

    拓展测试符号 [[ ]] (())

    数字测试符号
    # [ 10 < 2 ] # 语法错误
    -bash: 2: 没有那个文件或目录
    # 
    
    # [[ 2 > 10 ]] # 结果错误
    # echo $?
    0
    # [[ 20 > 10 ]] # 正确
    # echo $?
    0
    # (( 10 < 20 ))
    # echo $?
    0
    
    字符测试
    # [ "aa" = "aa" ]
    # echo $?
    0
    # [[ "aa" = "aa" ]]
    # echo $?
    0
    # (( "aa" = "aa" )) #结果错误
    # echo $?
    1
    混合测试
    # [ a = a -a 10 < 20 ]
    -bash: 20: 没有那个文件或目录
    [root@seker ~]# [[ a = a -a 10 < 20 ]]
    -bash: syntax error in conditional expression
    -bash: syntax error near `-a'
    [root@seker ~]# [[ a = a && 10 < 20 ]]
    [root@seker ~]# echo $?
    0
    [root@seker ~]# [[ a = a || 10 < 20 ]]
    [root@seker ~]# echo $?
    0
    [root@seker ~]# (( a = a || 10 < 20 ))
    [root@seker ~]# echo $?
    0
    [root@seker ~]# (( a = a && 10 < 20 ))
    [root@seker ~]# echo $?
    0
    [root@seker ~]# 
    结论: 
    比较数字,使用(( ))
    其他测试使用 [[ ]]
    包含数字比较的混合测试,使用[[ expr1 && expr2 ]] (( expr1 || expr2 ))
    
    两个文件的比较
    FILE1 -ef FILE2
    测试两个文件是否是相同的inode
    有时为了找到同一个INODE号的文件 更倾向于使用 find 命令的 -inum 或 --samefile
    
    FILE1 -nt FILE2
    FILE1 is newer (modification date) than FILE2
    
    FILE1 -ot FILE2
    FILE1 is older than FILE2
  • 相关阅读:
    Nginx的启动、停止与重启
    linux环境下安装nginx步骤
    关于Nginx的负载均衡
    【Nginx】实现动静分离
    nginx中的反向代理
    Nignx的简介
    ERROR 1822 (HY000): Failed to add the foreign key constraint. Missing index for constraint 'orderite
    mysql出现“ You can't specify target table '表名' for update in FROM clause”解决方法
    SpringMvc的工作原理图
    【Java多线程】Java中的13个原子操作类(十九)
  • 原文地址:https://www.cnblogs.com/zihe/p/6933809.html
Copyright © 2011-2022 走看看