抽取文本的工具

  • 文件内容: cat ,more,less
  • 文件截取:head,tail
  • 按列抽取:cut
  • 排序和统计:sort,wc

文本查看

文本文件内容

  • 文件查看命令:
    cat,nl,tac,rev
  • cat [OPTION]… [FILE]…
    • -E:显示行结束符$
    • -n:对显示出的每一行进行编号
    • -A:显示所有控制
    • -b:非空行编号
    • -s:压缩连续的空行成一行
  • nl
  • tac
  • rev

非文本文件内容

  • hexdump

    1
    2
    3
    4
    5
    6
    hexdump -C -n 512 /dev/sda
    00000000 eb 63 90 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0 |.c..............|
    echo {a..z} | tr -d ' '|hexdump -C
    00000000 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 |abcdefghijklmnop|
    00000010 71 72 73 74 75 76 77 78 79 7a 0a |qrstuvwxyz.|
    0000001b
  • od:dump files in octal and other formats

    1
    2
    3
    4
    echo {a..z} | tr -d ' '|od -A x -t x1z
    000000 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 >abcdefghijklmnop<
    000010 71 72 73 74 75 76 77 78 79 7a 0a >qrstuvwxyz.<
    00001b
  • xxd

    1
    2
    3
    echo {a..z} | tr -d ' '|xxd 
    0000000: 6162 6364 6566 6768 696a 6b6c 6d6e 6f70 abcdefghijklmnop
    0000010: 7172 7374 7576 7778 797a 0a qrstuvwxyz.

    分页查看

  • more:分页查看文件

    more [OPTIONS...] FILE...

    • -d: 显示翻页及退出提示
  • less:一页一页地查看文件或STDIN输出
    查看时有用的命令包括:
    /文本 搜索 文本
    n/N 跳到下一个 或 上一个匹配
    less 命令是man命令使用的分页器

显示文本前或后行内容

  • head [OPTION]… [FILE]…
    • -c # 指定获取前#字节
    • -n # 指定获取前#行
    • -# 同上
  • tail [OPTION]… [FILE]…
    • -c # 指定获取后#字节
    • -n # 指定获取后#行
    • -# 同上
    • -f 跟踪显示文件fd新追加的内容,常用日志监控,相当于 –follow=descriptor,文件被删除或移动走, 需要进行重新追踪
    • -F 跟踪文件名,相当于–follow=name –retry ,文件被删除或移动走, 不需要进行重新追踪,只要文件恢复回来会继续追踪
  • tailf 类似tail –f,当文件不增长时并不访问文件

文本处理

按列抽取文本cut和合并文件paste

  • cut [OPTION]… [FILE]…

    • -d DELIMITER: 指明分隔符,默认tab
    • -f FILEDS:
      • #: 第#个字段
      • #,#[,#]:离散的多个字段,例如1,3,6
      • #-#:连续的多个字段, 例如1-6
      • 混合使用:1-3,7
    • -c 按字符切割
    • –output-delimiter=STRING指定输出分隔符
  • 显示文件或STDIN数据的指定列

    • cut -d: -f1 /etc/passwd
    • cat /etc/passwd | cut -d: -f7
    • cut -c2-5 /usr/share/dict/words
  • paste 合并两个文件同行号的列到一行

    paste [OPTION]… [FILE]…

    • -d 分隔符:指定分隔符,默认用TAB
    • -s : 所有行合成一行显示

    示例:
    paste f1 f2
    paste -s f1 f2

收集文本统计数据wc

  • 可用于统计文件的行总数、单词总数、字节总数和字符总数

  • 可以对文件或STDIN中的数据统计

    1
    2
    3
    wc story.txt
    39 237 1901 story.txt
    行数 字数 字节数
  • 常用选项

    • -l 只计数行数
    • -w 只计数单词总数
    • -c 只计数字节总数
    • -m只计数字符总数
    • -L 显示文件中最长行的长度

文本排序sort

  • 把整理过的文本显示在STDOUT,不改变原始文件
    sort [options] file(s)
  • 常用选项
    • -r 执行反方向(由上至下)整理
    • -R 随机排序
    • -n 执行按数字大小整理
    • -f 选项 忽略字符串中的字符大小写
    • -u 选项(独特,unique)删除输出中的重复行
    • -t 指定列的分割符
    • -k 以指定字段为标准排序

去除文件中的重复行uniq

  • uniq命令:从输入中删除前后相接的重复的行

  • uniq [OPTION]… [FILE]…

    • -c: 显示每行重复出现的次数
    • -d: 仅显示重复过的行
    • -u: 仅显示不曾重复的行

    注:连续且完全相同方为重复

  • 常和sort 命令一起配合使用:

    sort userlist.txt | uniq -c

比较文件

  • 比较两个文件之间的区别

    1
    2
    3
    4
    5
    6
    7
    diff foo.conf foo2.conf
    5c5
    <
    use_widgets = no
    ---
    >
    use_widgets = yes
    • 注明第5行有区别(改变)
  • 可以使用vimdiff

复制对文件改变patch

  • diff 命令的输出被保存在一种叫做“补丁”的文件中

    使用 -u 选项来输出“统一的(unified)”diff格式文件,最适用于补丁文件

  • patch 复制在其它文件中进行的改变(要谨慎使用)
    使用 -b 选项来自动备份改变了的文件
    diff -u foo.conf foo2.conf > foo.patch
    patch -b foo.conf foo.patch

正则表达式

  • REGEXP: Regular Expressions,由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能

  • 程序支持:grep,sed,awk,vim, less,nginx,varnish等

  • 分两类:

    • 基本正则表达式:BRE
    • 扩展正则表达式:ERE
  • 正则表达式引擎:

    采用不同算法,检查处理正则表达式的软件模块

    PCRE(Perl Compatible Regular Expressions)

  • 元字符分类:字符匹配、匹配次数、位置锚定、分组

  • man 7 regex

基本正则表达式

  • 字符匹配:

    • . 匹配任意单个字符
    • [] 匹配指定范围内的任意单个字符,示例:[king] [0-9] [a-z] [a-zA-Z]
    • [^] 匹配指定范围外的任意单个字符
    • [:alnum:] 字母和数字
    • [:alpha:] 代表任何英文大小写字符,亦即 A-Z, a-z
    • [:lower:] 小写字母
    • [:upper:] 大写字母
    • [:blank:] 空白字符(空格和制表符)
    • [:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
    • [:cntrl:] 不可打印的控制字符(退格、删除、警铃…)
    • [:digit:] 十进制数字 [:xdigit:]十六进制数字
    • [:graph:] 可打印的非空白字符
    • [:print:] 可打印字符
    • [:punct:] 标点符号
  • 匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数

    • * 匹配前面的字符任意次,包括0次
      • 贪婪模式:尽可能长的匹配
    • .* 任意长度的任意字符
    • ? 匹配其前面的字符0或1次
    • \+ 匹配其前面的字符至少1次
    • \{n\} 匹配前面的字符n次
    • \{m,n\} 匹配前面的字符至少m次,至多n次
    • \{,n\} 匹配前面的字符至多n次
    • \{n,\} 匹配前面的字符至少n次
  • 位置锚定:定位出现的位置

    • ^ 行首锚定,用于模式的最左侧
    • $ 行尾锚定,用于模式的最右侧
    • ^PATTERN$ 用于模式匹配整行
      • ^​$ 空行
      • ^[[:space:]]*$ 空白行
    • \< 或 \b 词首锚定,用于单词模式的左侧
    • \> 或 \b 词尾锚定,用于单词模式的右侧
    • \<PATTERN\> 匹配整个单词
  • 分组:() 将一个或多个字符捆绑在一起,当作一个整体处理,如:(root)+

  • 分组括号中的模式匹配到的内容会被正则表达式引擎记录于内部的变量中,这些变量的命名方式为: \1, \2, \3, …

  • \1 表示从左侧起第一个左括号以及与之匹配右括号之间的模式所匹配到的字符

    示例:\(string1(string2\)\)

    ​ \1 :string1\(string2\)

    ​ \2 :string2

  • 后向引用:引用前面的分组括号中的模式所匹配字符,而非模式本身

  • 或者:\|

    示例: a\|b a或b

    ​ C\|cat C或cat

    ​ \(C\|c\)at Cat或cat

总结:

image-20200503142753267

image-20200503142817307

拓展正则表达式

  • 次数匹配:

    • * 匹配前面字符任意次
    • ? 0或1次
    • + 1次或多次
    • {m} 匹配m次
    • {m,n} 至少m,至多n次
  • 位置锚定:

    • ^ 行首
    • $ 行尾
    • \<, \b 语首
    • \>, \b 语尾
  • 分组:

    • ( )
    • 后向引用:\1, \2, …
  • 或者:

    • a|b a或b
    • C|cat C或cat
    • (C|c)at Cat或cat