• 【Shell】Shell编程之grep命令


    grep简介

    grep命令用于打印满足条件的行。egrep和fgrep是grep的变体,egrep命令是扩展的grep,支持更多的正则表达式元字符,fgrep命令被称为固定的grep,正则表达式元字符不会被特殊处理,它们只匹配自己。

    grep语法

    grep [OPTIONS] PATTERN [FILE...]
    grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]

    选项
    选项 功能
    -b 在每一行前面加上其所在的块号,根据上下文定位磁盘块时可用到
    -c 显示匹配到的行的数目,而不显示行的内容
    -h 不显示文件名
    -i 比较字符时忽略大小写
    -l 只列出匹配行所在文件的文件名,文件名直接用换行符分割
    -n 在每一行前加上它所在文件中的相对行号
    -s 无声操作,只显示报错信息,以检查退出状态
    -v 反向查找,只显示不匹配的行
    -w 把表达式作为词来查找,就像被<和>包含一样,只用于grep
    grep使用的正则表达式元字符
    元字符 功能 示例 匹配对象
    ^ 行首定位符 '^love' 匹配所有love开头的行
    $ 行尾定位符 'love$' 匹配所有love结尾的行
    . 匹配一个字符 ‘l..e’ 匹配包含一个l,后跟两个字符,再跟一个e的行
    * 匹配0个或多个前导字符 '*love' 匹配包含跟在0个或多个空格后的模式love的行
    [] 匹配一组字符中任一个 '[Ll]ove' 匹配Love或love的行
    [^] 匹配不在指定字符组内的字符 ‘[^A-K]ove’ 匹配包含一个不在A至K之间的字符,并且该字符后紧跟ove的行
    < 词首定位符 '<love' 匹配包含以love开头的词的行
    > 词尾定位符 'love>' 匹配包含以love结尾的词的行
    (...) 标记匹配到的字符 '(love)ing' 标记寄存器中的一段字符,被记作1号寄存器,如果之后要引用,用1,最多可以设置9个标签,从左边开始编号,最左侧的为1号;模式love被保存在1号寄存器,之后用1引用
    x{m}或x{m,}或x{m,n} 字符x的重复出现的次数:m次、至少m次、至少m次但不超n次 'o{5}'       'o{5,}'       'o{5,10}' 匹配连续出现5个o、至少5个o或5~10个o的行

    grep的退出状态

    • 0:匹配到模式;
    • 1:找不到模式;
    • 2:找不到要搜索的文件;
    示例:
    [root@db1 ~]# grep AleN /root/shell_stu/emp.txt 
    0001  AleN   M  24
    [root@db1 ~]# echo $?
    0
    [root@db1 ~]# grep AleNNN /root/shell_stu/emp.txt 
    [root@db1 ~]# echo $?
    1
    [root@db1 ~]# grep AleNNN /root/shell_stu/emp1.txt
    grep: /root/shell_stu/emp1.txt: No such file or directory
    [root@db1 ~]# echo $?
    2


    grep示例

    测试数据
    [root@db1 shell_stu]# cat emp.txt 
    0001  AleN   M  24
    0002  Tiboo  M  32
    0003  Felix  M  26
    0004  JacK   F  24
    0005  Tim    M  25
    0006  Audi   F  30
    0007  Bobo   F  32
    0008  Geo    M  21
    0009  Andy   F  19
    00010 Peter  M  28
    00011 Allen  M  26
    使用正则表达式的grep示例
    1、打印包含Tim的行
    [root@db1 shell_stu]# grep Tim emp.txt 
    0005  Tim    M  25
    2、打印Al开头,包含0个或多个l的行
    [root@db1 shell_stu]# grep All* emp.txt 
    0001  AleN   M  24
    00011 Allen  M  26
    3、打印以0001开头的行,^是句首定位符
    [root@db1 shell_stu]# grep '^0001' emp.txt 
    0001  AleN   M  24
    00010 Peter  M  28
    00011 Allen  M  26
    4、打印所有以6结尾的行,$是行尾定位符
    [root@db1 shell_stu]# grep '6$' emp.txt 
    0003  Felix  M  26
    00011 Allen  M  26
    5、第一个参数是模式,后面都是文件
    --打印包含Felix的行
    [root@db1 shell_stu]# grep Felix  emp.txt script.txt 
    emp.txt:0003  Felix  M  26
    script.txt:/Felix/{print "Hello "$2}
    6、打印包含所有数字的行
    [root@db1 shell_stu]# grep '^[0-9]' emp.txt 
    0001  AleN   M  24
    0002  Tiboo  M  32
    0003  Felix  M  26
    0004  JacK   F  24
    0005  Tim    M  25
    0006  Audi   F  30
    0007  Bobo   F  32
    0008  Geo    M  21
    0009  Andy   F  19
    00010 Peter  M  28
    00011 Allen  M  26
    7、打印包含字母的行
    --打印第1个字母大写,第2、3个字母小写,第4个为空格,第5个大写的行
    [root@db1 shell_stu]# grep '[A-Z][a-z][a-z] [A-Z]' emp.txt 
    --打印第1个字母大写,第2、3个字母小写,第4个大写的行
    [root@db1 shell_stu]# grep '[A-Z][a-z][a-z][A-Z]' emp.txt 
    0001  AleN   M  24
    0004  JacK   F  24
    8、打印至少有4个字母连在一起的行
    [root@db1 shell_stu]# grep '[a-z]{4}' emp.txt 
    0002  Tiboo  M  32
    0003  Felix  M  26
    00010 Peter  M  28
    00011 Allen  M  26
    9、打印所有以Audi开始的词的行,<是词首定位符
    [root@db1 shell_stu]# grep '<Audi' emp.txt 
    0006  Audi   F  30
    10、打印所有以o结尾的词的行,<是词尾定位符
    [root@db1 shell_stu]# grep 'o>' emp.txt 
    0002  Tiboo  M  32
    0007  Bobo   F  32
    0008  Geo    M  21
    --打印所有包含Audi词的行
    [root@db1 shell_stu]# grep '<Audi>' emp.txt 
    0006  Audi   F  30
    11、打印所有以A至Z开始,以o结尾的词的行
    [root@db1 shell_stu]# grep '<[A-Z].*o>' emp.txt 
    0002  Tiboo  M  32
    0007  Bobo   F  32
    0008  Geo    M  21
    使用选项的grep示例
    12、打印包含字母A的行,-n列出行号
    [root@db1 shell_stu]# grep -n 'A'  emp.txt 
    1:0001  AleN   M  24
    6:0006  Audi   F  30
    9:0009  Andy   F  19
    11:00011 Allen  M  26
    13、打印包含alen的行,-i忽略大小写
    [root@db1 shell_stu]# grep -i 'alen' emp.txt 
    0001  AleN   M  24
    14、打印不包含AleN的行,-v不包含
    [root@db1 shell_stu]# grep -v 'AleN' emp.txt 
    0002  Tiboo  M  32
    0003  Felix  M  26
    0004  JacK   F  24
    0005  Tim    M  25
    0006  Audi   F  30
    0007  Bobo   F  32
    0008  Geo    M  21
    0009  Andy   F  19
    00010 Peter  M  28
    00011 Allen  M  26
    15、列出包含模式Felix的文件名,-l列出文件名,不输出文本行
    [root@db1 shell_stu]# grep -l 'Felix' *
    emp.txt
    script.txt
    16、打印模式A出现的行的次数,-c表示行的数目
    [root@db1 shell_stu]# grep -c 'A' emp.txt 
    4
    [root@db1 shell_stu]# grep  'A' emp.txt 
    0001  AleN   M  24
    0006  Audi   F  30
    0009  Andy   F  19
    00011 Allen  M  26
    17、打印包含词Tim的行,-w查找的是词,不是词的一部分
    [root@db1 shell_stu]# grep -w 'Tim' emp.txt 
    0005  Tim    M  25



  • 相关阅读:
    线性代数学习路线
    补充.关于秩的不等式
    第十讲.无关性、基与维数
    第九讲.Ax = b
    第八讲.Ax = 0
    大三下学期第一个月反思
    第六讲.LU分解
    第五讲.矩阵的逆
    第四讲.矩阵的运算
    NAT 实验
  • 原文地址:https://www.cnblogs.com/alen-liu-sz/p/12975669.html
Copyright © 2020-2023  润新知