Linux-2020-spring-4-8

来自SUDA-HLT
Zhli(讨论 | 贡献)2020年4月9日 (四) 04:12的版本 (→‎egrep命令)
跳到导航 跳到搜索

复习

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

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)$'

正则表达式 regular expression

  • 正则表达式的定义:表达正则语言的一个式子;以一定规则写出来的一个字符串,作为一个抽象的模式,用以匹配一个、多个甚至无穷多个实际的字符串。

例子都在上面。

  • 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表示非单词边界


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

一些讨论

  • 正则语言所处的位置
 正则语言:正则表达式所能表达的所有字符串的集合
 上下文无关语言:context-free language
 程序语言:program language
 自然语言:natural language
  • C语言的一些讨论
 C语言的特点:没有歧义
 1、高级语言:它是把高级语言的基本结构和语句与低级语言的实用性结合起来的工作单元。 2、结构式语言:结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C 语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。4、代码级别的跨平台:由于标准的存在,使得几乎同样的C代码可用于多种操作系统,如Windows、DOS、UNIX等等;也适用于多种机型。C语言对编写需要进行硬件操作的场合,优于其它高级语言。 5、使用指针:可以直接进行靠近硬件的操作,但是C的指针操作不做保护,也给它带来了很多不安全的因素。C++在这方面做了改进,在保留了指针操作的同时又增强了安全性,受到了一些用户的支持,但是,由于这些改进增加语言的复杂度,也为另一部分所诟病。Java则吸取了C++的教训,取消了指针操作,也取消了C++改进中一些备受争议的地方,在安全性和适合性方面均取得良好的效果,但其本身解释在虚拟机中运行,运行效率低于C++/C。一般而言,C,C++,java被视为同一系的语言,它们长期占据着程序使用榜的前三名。

课堂讨论

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

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