Linux-2020-spring-4-8

来自SUDA-HLT
跳到导航 跳到搜索

复习

  • 通配符
  • 重定向
  • 命令行参数

find 命令

  • 从目录树中搜索文件(默认是递归查找)
  • -name选项默认支持通配符
   $ find . -name '*.txt'  
   $ find / -name 'find' # 文件的名字是find
     Permission denied(报错)
     为了不再屏幕上显示错误信息?重定向,或者以root权限来做
   $ find / -name 'find' 2> x.txt
   $ find / -name 'find' 2> /dev/null # 黑洞输出设备
   $ sudo find / -name '??????????' :查找文件名字为十个字符的文件,以root的名义

egrep命令

  • grep:查找并输出可以匹配指定模式的所有行(我猜对应的英文缩写:get RE pattern;另一个解读是global search RE and print out the lines)
 egrep执行效果与grep -E相似,使用的语法及参数可参照grep指令,与grep的不同点在于解读字符串的方法。egrep是用extended regular expression语法来解读的,而grep则用basic regular expression 语法解读,extended regular expression比basic regular expression的表达更简单,不用频繁使用转义符\backslash。
  • 一些例子
   $egrep 'int' main.c
   $egrep -n 'int' # ctrl+d或记为^D,表示输入结束,-n表示同时输出行号
   $egrep -n '[ijklm]nt'
   $egrep -n '[^0-9]nt'
   $egrep -n '[0-9]nt'
   $egrep -n '.nt'
   $egrep -n 'a*bc'
   $egrep -n 'a*?bc'
   $egrep -n 'a?bc'
   $egrep -n '[0-9]*bc'
   $egrep -n 'abc|bcd'
   $egrep -n '(abc|bcd)[0-9]+'
   $egrep -n '^(abc|bcd)'
   $egrep -n '^(abc|bcd)$'
  • egrep还有一些选项很有用,如
 -o 
 -A
 -B

正则表达式 regular expression

推荐大家采用我的最新讲义来系统学习RE,目前未定稿,欢迎大家提出问题和建议:链接为文件:Linux-RE.pdf

  • 定义Definition:RE是满足正则语言语法的一个字符串,作为一个抽象的模式,用以匹配一个、多个甚至无穷多个实际的字符串。

例子都在上面。

  • literal字面意思
  • [ ] 字符集, [^ ]补集'
  • 自定义字符集
 \w [ [:alphanum:]]
 \d [ [:digit:]]
 \s
  • . 任意一个字符,不能匹配\n\r
  • 重复修饰符(默认为贪心greedy匹配最长的字符串)
 * 表示前面的字符匹配0次到n次
 ? 表示可取0个/1个
 + 重复一次到无穷多次
 {3} 重复3次
 {3,5} 3次到5次
 {3,} 3次到无穷
  • 分组group ()
  • | 或Alternation
  • 定位符anchoring
 ^表示行首
 $表示行尾
 \< \>表示单词的首/尾
 \b表示单词边界
 \B表示非单词边界


  • 通配符和正则表达式的对应
 *       ?
 .*      .

一些讨论

  • 正则语言所处的位置
 正则语言:正则表达式所能表达的所有字符串的集合:OR符合正则语言语法的所有RE的集合(这两个意思是不同的,需要琢磨一下,我倾向于后者)
 上下文无关语言:context-free language
 程序语言:program language
 自然语言:natural language

课堂讨论

重复修饰符:表示前一个单元(作为整体、不可分割)的重复次数

优先级:分组(括号)> 重复 > 拼接 > 或(|)


补充学习

find

根据文件的访问(修改)时间?
根据文件大小?