linux学习(五)——正则表达式

文章目录

    • 基础正则
    • grep 与正则
    • sed 与正则
    • 扩展正则
    • 练习题:

基础正则

  • 正则表达特殊符号
    • [:alnum:]代表英文大小写字母及数字
    • [:alpha:]代表英文大小写字母
    • [:blank:]代表空格和 tab 键
    • [:cntrl:]键盘上的控制按键,如 CR,LF,TAB,DEL
    • [:digit:]代表数字
    • [:graph:]代表空白字符以外的其他
    • [:lower:]小写字母
    • [:print:]可以被打印出来的任何字符
    • [:punct:]代表标点符号
    • [:upper:]代表大写字母
    • [:space:]任何会产生空白的字符如空格,tab,CR 等
    • [:xdigit:]代表 16 进位的数字类型
  • 查找小写字母:grep -n '[[:lower:]] regular_express.txt
  • 查找数字:grep -n '[[:digit:]] regular_express.txt

grep 与正则

  • 搜索特定字符串
    • -a :将 binary 档案以 text 档案的方式搜寻数据

    • -c :计算找到 ‘搜寻字符串’ 的次数

    • -i :忽略大小写的不同,所以大小写视为相同

    • -n :顺便输出行号

    • -v :反向选择,亦即显示出没有 ‘搜寻字符串’ 内容的那一行!

    • grep -n 'the' regular_express.txt

    • grep -in 'the' regular_express.txt 忽略大小写

    • grep -vn 'the' regular_express.txt 没有the的

  • 字符组匹配
    • 字符组支持由连字符“ - ”来表示一个范围。当“ - ”前后构成范围时,要求前面字符的码位小于后面字符的码位。
    • [^…] 排除型字符组。排除后面的字符。
      • [abc] :表示“a”或“b”或“c”
        [0-9] :表示 0~9 中任意一个数字,等价于[0123456789]
        [\u4e00-\u9fa5] :表示任意一个汉字
        [^a1<] :表示除“a”、“1”、“<”外的其它任意一个字符
        [^a-z] :表示除小写字母外的任意一个字符
    • 例子:
      • grep -n 't[ae]st regular_express.txt' 查找’tast’ ‘test’
      • grep -n '[^#] regular_express.txt' 查找不含“#”字符串
      • grep -n [^g]oog regular_express.txt 查找oog前无g的字符串
      • grep -n [^g]oog regular_express.txt 查找oog前无g或者o的字符串
  • 行首符号^与行尾符$
    • 你想要只查找行首为“the”的字符行,则使用以下命令:grep -n '^the' regular_express.txt
    • 查找行首为大写字母的所有行:
      grep -n '^[A-Z]' regular_express.txt [^A-Z]表示除A-Z所有字符
    • 查找以d结尾的行grep -n 'd$' regular_express.txt
    • 查找空行 grep -n '^$' regular_express.txt
  • 任意一个字符. 与重复字符*
    • 查找a?ou?的字符:
      • grep -n 'a.ou.' regular_express.txt :
      • 在这里插入图片描述
    • * 代表重复前面0个或者多个字符
      • grep -n 'e*' regular_express.txt 表示具有空字符或者一个以上 e 字符。
      • grep -n '@*' regular_express.txt 代表匹配所有
      • grep -n 'eee*' regular_express.txt代表前面两个e必须有,第三个则可以是0或者多个e
        • 在这里插入图片描述
  • 限定连续字符范围{}
    • { }可限制一个范围区间内的重复字符数。举个例子,若要找出 2~5 个 o 的连续字符串,如何做? 此时便要用到{}了。由于 { 与 } 在 shell 中有特殊意义,需要用到转义字符\。
    • 查找连续的两个 o 字符:
      grep -n 'o\{2\}' regular_express.txt结果与命令
      grep -n 'ooo*' regular_express.txt 的结果相同。
    • 查找 g 后面接 2 到 5 个 o,然后再接 g 的字符串
      grep -n 'go\{2,5\}g' regular_express.txt

sed 与正则

  • sed 把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改原文件。
  • 删除 d
    • nl regular_express.txt | sed '2,5d' nl 输出行号 '2,5d'表示删除2-5行
    • nl regular_express.txt | sed '2,$d' 删除第三到最后一行
    • sed -i '1d' regular_express.txt 从源文件删除第一行
  • 添加:
    • nl regular_express.txt | sed '2a test' :再第二行后添加test字符串
    • nl regular_express.txt | sed '2i test' :在第二行前
    • nl regular_express.txt | sed '2a test\ntest' :在第二行后加两行test
  • 替换 nl regular_express.txt | sed '2,5c No 2-5 number' 2-5行换为 No 2-5 number
  • 列出:nl regular_express.txt | sed -n '5,7p' 列出5-7行

扩展正则

  • grep -v '^$' regular_express.txt | grep -v '^#' 是正规表示;化为扩展:
  • egrep -v '^$|^#' regular_express.txt
  • grep -E 与 egrep 相当于命令别名关系。
  • + :表示重复一个或一个以上的前一个 RE 字符
    • egrep -n 'go+d' regular_express.txt
    • 在这里插入图片描述
    • 普通写法: grep -n 'goo*d' regular_express.txt
  • :表示重复零个或一个前一个 RE 字符
    • egrep -n 'gd|good' regular_express.txt
    • 在这里插入图片描述
  • | :找出数个字符串:egrep -n 'gd|good' regular_express.txt
  • ():找出群组字符串:egrep -n 'g(la|oo)d' regular_express.txt
    在这里插入图片描述
  • ()+ 多个重复群组判别:
    • 找开头是 A 结尾是 C 中间有一个以上的 ‘xyz’ 或字符串:
    • echo 'AxyzxyzxyzxyzC'|egrep 'A(xyz)+C'

练习题:

新建结果文件 /home/shiyanlou/result ,将用户记录的编辑结果(如查找结果等)输出到该文件中

要求顺便输出行号

找出登录 Shell 为 bash 的用户行记录

找出 UID 或 GID 是5位数及以上的用户行记录

有主目录在 /var/spo??l 下的用户,但想不起来 spo 到底有几个 o ,找出满足条件的用户行记录

已知有个用户其用户名形如 ‘mi…M’ 中间有多个未知的 mi,找出该用户行记录linux学习(五)——正则表达式_第1张图片

你可能感兴趣的:(linux命令,linux)