Shell攻略4:文本处理

By | 2016年11月4日 | 阅读:646 次

文本处理


  • 正则表达式

    • POSIX定义了2种正则表达式语法:基本正则表达式BRE和扩展正则表达式ERE
    • BRE 定义的语法符号包括:
      • . 匹配任意1个字符
      • [] 字符集匹配
      • [^] 字符集否定匹配
      • ^; $
      • * 任意次匹配
      • {m,n} ; {m} ; {m,} ;
    • ERE 修改了 BRE 中的部分语法,并增加了以下语法符号:
      • ?; +
      • | 或运算
    • 通用的模式匹配,在Js, PHP和Shell中用法相同
      • 字符个数匹配
        • ‘.’:匹配任意1个字符
        • ‘?’:之前项 0 | 1 次
        • ‘+’:之前项 1 | N 次
        • ‘*’:之前项 0 | 1 | N 次
      • ‘^’和’$’:行首和行尾项
    • 其余元字符参考 Wiki
    • 攻略2中tr使用的事正则特定字符集合[:digit:]即[0-9];[alpha]即[a-zA-Z]…
  • grep文本搜索

    • 在文件或stdin中搜索特定的字串
    • $ grep -E ‘–extended-regexp’ file # 即egrep:使用正则表达式匹配文件内容
    • grep选项
      • -o, –only-matching # 只输出正则匹配到的文本
      • -l, –files-with-matches # 搜索多个文件list
      • -c, –count # 统计匹配到的行数
      • -e PATTERN, –regexp=PATTERN # 指定多个正则 – -i, –ignore-case
      • -n, –line-number
      • -q, –quiet, –silent # 静默模式匹配,匹配到则成功:$?为0
      • -b, –byte-offset # 匹配到的字串在该文本行中的字符偏移从0计)
      • -v, –invert-match # 取反结果,同find -v
      • -r, -R, –Reursion # 递归搜索目录
      • -f FILENAME, –pattern-file # 将多个正则写入文件,分别匹配
      • -z –Zero # 将搜到的行(文件名列表)结合xargs操作文件
      • 其他选项:man grep
    • 指定或排除文件
      • –include {file_list} # 指定搜索范围
      • –exclude {file_list} # 搜索中排除
      • –exclude NoSearchFile # 将不搜索的文件指定在文件列表中
      • –exclude-dir dir_name # 搜索中排除目录
    • 输出匹配到的文本前后的行
      • -A NUM, –after-context=NUM
      • -B NUM, –before-context=NUM
      • -C NUM, -NUM, –context=NUM # 上下文:-A NUM; -B NUM
  • cut按列切分文件

    • $ cut -f n1,n2 –field # 提取第n1,n2列
      • -d, –delimiter # 指定各列间分隔符为’,’默认Tab
      • -f n –complement # n字段补集
    • 精确指定field或字节或字符范围
      • 范围单位
        • -f n # n个字段
        • -b n # n个字节
        • -c n # n个字符
      • 范围
        • N- # 第N个单位到行尾
        • -M # 行首到第N个单位
        • N-M # 单位间
      • –output-delimiter # 指定输出定界符
  • sed文本替换

    • $ sed -i ‘s/string/replace_str/Ng’ file
      • 将file中string全部替换为replace_str
      • -i 保存修改到原文件
      • /g:替换所有string; /5g:替换第五个string
      • /:定界符,可任意指定,以文本形式出现时转义即可
      • 与vim命令行模式下替换文本相似
        • :n1,n2s/word1/word2/g # 在n1-n2行间替换word1为word2
        • :1,$s/word1/word2/gc # 在全文本(1-最后一行)替换,并让用户逐一confirm
    • $ sed ‘/^$/d’ file # d标志delete文件中空白行
    • $ sed “s/string/$replace/g”
    • 后向引用
      • $ INPUT | sed ‘s/reg_express/back_reference/g’
        • 常用正则
        • back_reference: &为匹配到的各项; \n为匹配到的第n项
        • sed参考查看
  • awk高级处理

    • $ INPUT | awk …
      • BEGIN{}: awk读入数据流前执行 # 变量初始化,剔除多与数据,输出文件信息…
      • Conditions {}: 无条件时直接执行{},每读取stdin 1行执行1次 {}
        • 没有中间语句块:默认{ print } 打印读取的每一行
        • Conditios:正则匹配、条件判断等
        • Statements
          • awk中直接写变量名,不加$;与bash和Shell的变量不同
          • cmd1; cmd2; cmd3 或者 cmd1 [Enter] cmd2 [Enter] cmd3
          • 独有的print默认换行
      • END{}:awk读取完所有行后立即被执行 # 打印汇总信息…
    • awk中的特殊变量
      • NR: stdin中当前行的行号
        • END { print NR } # 统计文件行数:最后一行行号
      • NF: 当前行$0的字段数,值为最后一个字段号数
        • ${NF-1} # 倒数第二个字段
      • $0: 当前行所有内容
      • $1: 当前行第1字段内容 # $n同理
    • getline读取一行
      • $ awk … getline $0, $1, $2访问获取到行的内容
      • $ INPUT | getline var; # 将输入放入变量
    • awk命令行过滤模式
      • 设置NR、NF条件判断
    • awk内建字符串处理函数
      • length(string);
      • index(string, search_str);
      • substr(string, start, end);
      • match(reg_exp, string);
    • 实例:统计文本文件中词出现的频率
      • 单词名做索引的关联数组并计数++
    • awk实现tac逆序输出文件内容
  • paste按列合并文件

    • $ cat file1 file2 # 按行合并文件
    • $ paste file1 file2 -d, # 按列合并文件,指定’,’分割列,默认Tab

2 thoughts on “Shell攻略4:文本处理

发表评论

电子邮件地址不会被公开。