• bash通配符≠RegEx
    • 如星号*的区别
  • 依照严谨程度分为基础正则表达式和扩展正则表达式
  • 语系对正则表达式的结果有影响
    • 要留意当前环境的语系
    • 一般采用C语系或en等英文语系
  • 正则表达式需要工具程序辅助才能实现
  • 特殊符号
    • [:alnum:]:(alpha & number)[0-9A-Za-z]
    • [:alpha:]:[A-Za-z]
    • [:blank:]:空格或[tab]
    • [:cntrl:]:(control)键盘上的控制按钮CR,LF,TAB,DEL等
    • [:digit:]:[0-9]
    • [:graph:]:除了[:blank:](空格符)外的其他所有按键
    • [:lower:]:[a-z]
    • [:print:]:任何可打印字符
    • [:punct:]:(punctuation symbol)标点符号
    • [:upper:]:[A-Z]
    • [:space:]:任何会产生空白的字符(包含[:blank:])空格键、tab、CR等
    • [:xdigit:]:十六进制数字符[0-9a-fA-F]
  • grep的高级参数
    • 基本语法:grep [-A] [-B] [--color=auto] '搜寻字符串' filename
      • -A:(after)  后接数字,表示除了列出匹配行外,后续几行也列出来
      • -B:(before)后接数字,表示除了列出匹配行外,前面几行也列出来
      • --color=auto:匹配数据显示特殊颜色
  • 基础正则表达式字符
    • ^word:待查找的字符串word在行首
    • word$:待查找的字符串word在行尾
    • .:一个任意字符
    • \:转义字符
    • *:前一个字符重复0~∞次
    • [list]:list中的字符集中的任意一个字符
    • [n1-n2]:字符集中使用范围
    • [^list]:反向选择
    • \{n,m\}:前一个字符重复n~m次
      • 此处用了转移,是因为bash下花括号{}代表了命令块
  • sed工具:管道命令之一
    • 用于分析stdin
    • 基本语法:sed [-nefr] [动作]
      • -n:(silent)安静模式,只显示被处理的行
        • 默认显示所有行
      • -e:直接在命令行模式上进行sed的动作编辑
      • -f:后接filename,引用filename文件来作为[动作]
      • -r:使用扩展正则表达式
        • 默认为基础正则表达式
      • -i:直接修改文件,不输出到屏幕(危险操作)
        • 一般用来修改、替换大文件的内容
        • 比如100W行的文件,用vim是不合理的
      • [动作]说明:
        • 格式:[n1 [,n2] ] function
        • n1,n2:为进行function操作的行范围,$可以代表最后一行
        • function:
          • a:新增,后接字符串,会出现在n1的下一行(此时不需要n2)
            • 若要新增多行,可以用反斜杠(\)转移回车[Enter]
          • c:替换,后接字符串,用该字符串替换n1-n2行的内容
          • d:删除,通常不接参数
          • i:插入,后接字符串,会出现在n1的上一行(此时不需要n1)
          • p:打印,打印出所选择的行(一般与-n一起用)
          • s:替换,可以通过正则表达式匹配替换字符串
            • 形式:n1,n2s/OLDSTR/NEWSTR/g
            • 将n1-n2间OLDSTR匹配的字符串替换为NEWSTR字符串
  • 扩展正则表达式
    • +:前一个字符重复1~∞次
    • ?:前一个字符重复0~1次
    • |:用或(or)的方式找出数个字符串
      • 如aaa|bbb可以匹配aaa或bbb
    • ():分组
    •  
    • grep只支持基础正则表达式,egrep支持扩展正则表达式
  • printf:格式化打印
    • 基本语法:printf '打印格式' 实际内容
    • 打印格式(类似C语言):
      • \a:警告声音输出
      • \b:退格键
      • \f:清屏
      • \n:换行
      • \r:回车键
      • \t:水平[tab]
      • \v:垂直[tab]
      • \xNN:NN为两位数字,转换为对应ASCII码的字符
      • %ns:
      • %ni
      • %N.nf
    • 如:printf '%s\t %s\t %s\t %s\t \n' $(cat printf.txt)
  • awk:小型数据处理工具
    • 将一行分为多个“字段”处理,默认分隔符为空格或[tab]
    • 基本语法:awk '条件类型1{动作1} 条件类型2{动作2} .....' filename
      • 若不给出条件类型,则直接执行动作
      • 内置变量
        • $0,$1,$2等
        • NF:该行拥有的字段总数
        • NR:当前为第几行
        • FS:分隔符,默认为空格
      • 运算符
        • >  <  >=  <=  ==  !=
      • 设置变量
        • 直接用等号赋值即可
      • 条件类型关键字BEGIN和END
        • 可以使awk开始读取数据前做预处理,或读取所有数据后做后续处理
        • 如:改变分隔符
          • cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t" $3}'
      • 注意
        • 动作内的命令可以有多个,用分号(;)来分隔,也可以直接用[Enter]隔开
        • 变量直接使用,无需加前导符$
        • 动作内是支持if语句的,因此条件类型也可以放入动作中
    • 工作流程
      • 读入第一行,将该行的数据填入$0,$1,$2等变量
        • $0代表整行,其余代表第几字段
      • 依据条件类型的限制,判断是否需要进行总做
      • 做完所有的动作和条件类型
      • 处理后续的行
  • 纯文本比较、目录比较:diff
    • 以行为单位
    • 基本用法:diff [-bBi] from-file to-file
      • from-file:欲做比较的文件
      • to-file:目的比较文件
      • 也可以用减号-表示stdin
      •  
      • -b:忽略多个空白的区别
      • -B:忽略空白行的区别
      • -i:忽略大小写的区别
    • 也可以直接比较目录间的区别
  • 二进制文件比较:cmp
    • 以字节为单位
    • 基本语法:cmp [-s] file1 file2
      • -s:列出所有不同点处的字节处
        • 默认值列出第一个不同点
  • diff + patch:补丁制作与还原
    • 制作补丁文件:diff -Naur OLDFILE NEWFILE > FILE.patch
      • 比较新旧文件NEWFILE和OLDFILE,制作不定文件FILE.patch
    • 更新文件:patch -pN < FILE.patch
      • 新旧文件信息会记录在FILE.patch中,包括文件名
      • 执行该命令后会将OLDFILE的内容更新为NEWFILE的内容(文件名不变)
      • -p:取消N层目录(用于整个目录的补丁)
        • 同一目录下直接使用-p0即可
    • 还原文件:patch -R -pN < FILE.patch
      • 执行该命令后会将NEWFILE的内容还原为OLDFILE的内容(文件名不变)
      • -R:代表还原
  • 文件打印准备:pr

\00