第七章 Linux文本处理工具

各种文本工具来查看,分析,统计文本

文件查看

  • 文件查看命令:
    • cat,nl,tac,rev
cat
  • cat [OPTION] …[FILE]…
    • -E:显示行结束符$
    • -n:对显示出的每一行进行编号
    • -A:线索所有控制符
    • -b:只对非空行编号
    • -s:压缩连续的空行成一行
nl:相当于cat - nb(只对非空行编号,且显示行号)
tac:根cat显示的效果正好相反(从行尾开始读)
rev:把输入的行,倒着显示
more:
  • 分页显示文件内容,回车一行一行往下翻
  • -d:显示翻页及退出提示
less:
  • 一页一页地查看文件或STDIN输出查看时有用的命令包括:
  • /文本 搜索 文本
  • n/N 跳到下一个或上一个匹配
  • less 命令是man命令使用的分页器
head:
  • head [OPTION]… [FILE]…
  • -c # 指定获取前#字节(如果是负数就是去掉最后的第几个字符,例如-1,去掉最后一个字符)
  • -n # 指定获取前#行
  • -# 指定行数
  • 默认取前10行
tail:
  • 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 按字符切割

    • -b 按字节切割(用于二进制)

    • –output-delimiter=STRING指定输出分隔符

  • cut详细讲解

## 示例
### 取passwd的前五行,根据:做分隔符,取第一个,第3、4、5满足条件的域默认是用:分割结果显示
cat /etc/passwd|head -n 5|cut -d : -f 1,3-5
### 
who|cut -b 2
who|cut -c 2
  • paste合并两个文件同行号的列到一行
    • paste [OPTION]…[FILE]…

    • -d 分隔符:指定分隔符,默认用TAB

    • -s:所有行合成一行显示(paste -s file1 file2 将file1的所有行合成到第一行,将file2合成到第二行。行内默认用tab分割,也可以使用-d选项指定分隔符)

    • 例 paste f1.txt f2.txt 横向合并(用tab分隔)

分析文本的工具

  • 文本数据统计:wc
  • 整理文本:sort
  • 比较文件:diff和patch
收集文本统计数据wc(word count 简写)
  • 计数单词总数、行总数、字节总数和字符总数

  • 可以对文件或STDIN中的数据运行

    • wc story.txt
    • 39 237 1901 story.txt
    • 行数 单词数 字节数
  • 常用选项

    • -l:只计数行数
    • -w:只计数单词总数
    • -c:只计数字节数总数
    • -m:只计数字符总数
    • -L:显示文件中最长行的长度
文本排序sort
  • 把整理过的文本显示在STDOUT,不改变原始文件

  • sort [OPTION] file(s)

    默认情况下,sort命令,以字母序进行文本排序(数字排序使用-n选项)

  • 常用选项

    • -r:倒序排

    • -R:随机排序

    • -n:执行按数字大小整理

    • -f:选项忽略(fold)字符串中的字符大小写

    • -u:选项(独特,unique)删除输出中的重复行

    • -t c:选项使用c做为字段界定符

    • -K #:选项按照使用c字符分隔后的第#列来整理能够使用多次

    • 例如将/etc/passwd按uid排序:

      • 1.cat /etc/passwd|sort -t: -k 3 -n
        1. sort -t: -k 3 -n /etc/passwd
uniq
  • uniq命令:从输入中删除前后相接的重复的行

  • uniq [OPTION]…[FILE]…

    • -c:显示每行重复出现的次数
    • -d:仅显示重复过的行
    • -u:仅显示不曾重复的行
    • 注:连续且完全相同方位重复
  • 常和sort命令一起配合使用:

    • sort userlist.txt | uniq -c
diff
  • 比较两个文件之间的区别

    • diff foo1.conf foo2.conf
    • 5c5
    • < use_widgets=no
    • use_widgets=yes
    • 注明第5行有区别(改变)
  • -u:显示详细信息

  • patch -b a.txt diff.log :将a.txt和b.txt比较的日志diff.log,还原成b.txt文件

文本处理三剑客grep

  • grep:文本过滤(模式:pattern 工具)

    • grep,egrep,fgrep(不支持正则表达式搜索)
  • sed:stream editor,文本编辑工具

  • awk:Linux上的实现gawk,文本报告生成器

grep
  • grep : Global search REgular expression and Print out the line

  • 作用:文本搜索工具,根据用户指定的”模式“对目标文本逐行进行匹配检查;打印匹配到的行

  • 模式:由正则表达式字符及文本字符所编写的过滤条件

  • grep [OPTIONS] PATTERN [FILE…]

    • grep root /etc/passwd
    • grep “$USER” /etc/passwd
    • grep ‘$USER’ /etc/passwd
    • grep whoami /etc/passwd
  • grep命令选项

    • –color=auto:对匹配到的文本着色显示

    • -m #:匹配#次后停止(一行算一次)

    • -v :显示不被pattern匹配到的行

    • -i :忽略字符大小写

    • -n :显示匹配的行号

    • -c : 统计匹配到的行数

    • -o : 仅显示匹配到的字符串

    • -q : 静默模式,不输出任何信息

    • -A #: after,表达式匹配到行的后#行

    • -B #: before,表达式匹配到行及所在行的前#行

    • -C #: context,表达式匹配到行及它所在行的前后各#行

    • -e :实现多个选项间的逻辑or关系

      • grep -e ‘cat’ -e ‘dog’ file
    • -w :匹配整个单词

    • -E:使用ERE

    • -F:相当于fgrep,不支持正则表达式

    • -f file :根据模式文件处理

正则表达式

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

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

  • 分两类:

    • 基本正则表达式:BRE
    • 扩展正则表达式:ERE
      • grep -E, egrep
  • 正则表达式引擎:

    • 采用不同算法,检查处理正则表达式的软件模块
    • PCRE(Perl Compatible Regular Epressions)
  • 元字符分类:字符匹配、匹配次数、位置锚定、分组

  • man 7 regex

基本正则表达式元字符
  • 字符匹配:

    • .:匹配任意单个字符

    • []:匹配指定范围内的任意单个字符,示例:[wang] [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\|cab C或cab
      • \(C\|c\)at Cat 或者cat

扩展正则表达式

  • egrep = grep -E

  • egrep [OPTIONS] PATTERN [FILE…]

  • 扩展正则表达式的元字符:

    • . 任意单个字符
    • []:指定范围的字符
    • [^]:不在指定范围的字符
  • 次数匹配:

    • *:匹配前面字符任意次
    • ?: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

文本处理三剑客Sed

  • Stream Editor,行编辑器
  • sed是一种流编辑器,他一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。然后读入下行,执行下一个循环,如果没有使用诸如‘D’的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。
  • 功能:主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序
  • 参考:http://www.gnu.org/software/sed/manual/sed.html

sed工具

菜鸟教程sed

  • 用法:sed [OPTION] … ‘script’ inputfile…

  • 常用选项:

      -e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
      
      -f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
      
      -h或--help 显示帮助。
      
      -n或--quiet或--silent 仅显示script处理后的结果。通常和动作p一起使用
      
      -V或--version 显示版本信息。
    
  • script:

    • ‘地址命令’
  • 地址定界:

    (1)不给地址:对全文进行处理

    (2)单地址:

    #: 指定的行。
    $:最后一行;
    /pattern/:被此处模式所能匹配到的每一行
    

    (3)地址范围:

    #,#
    #,+#
    /pat1/,/pat2/
    #,/pat1/
    

    (4)~:步进

    1~2	奇数行
    2~2	偶数行
    
  • 动作说明:

    注:'[\]'表示空格,如果文本前面是空格,使用\分割a 和text;一次使用多个命令时,使用';'分割。
    
    d	删除模式空间匹配的行,并立即启用下一轮循环
    
    p	打印当前模式空间的内容,追加到默认输出之后
    
    a [\]text	在指定行后面追加文本,支持使用\n实现多行追加
    
    i [\]text	在行前面插入文本
    
    c [\]text	替换行为单行或多行文本
    
    w /path/file	保存模式匹配的行至指定文件
    
    r /path/file	读取指定文件的文本至模式空间中匹配到的行后
    
    =	为模式空间的行打印行号
    
    !	模式空间中匹配行取反处理
    
  • s/// 查找替换,支持使用其它分隔符,s@@@,s###

  • 替换标记:

    g	行内全局替换
    p	显示替换成功的行
    w /PATH/FILE	将替换成功的行保存至文件中
    
sed命令:
  • 格式:sed -n “开始行,结束行p” 文件名
  • sed -n ‘7,15p’ filiname 输出第7行到第15行的内容
  • sed -n '6p;26,40p; ’ filename 输出第6行 和 26到40行
  • sed -n 5p filename 输出第5行

高级命令

p:	打印模式空间开端至\n内容,并追加到默认输出之前
h:	把模式空间中的内容覆盖至保持空间中
H:	把模式空间中的内容追加至保持空间中
g:	从保持空间取出数据覆盖至模式空间
G:	从保持空间取出内容追加至模式空间
x:	把模式空间中的内容与保持空间中的内容进行互换
n:	读取匹配到的行的下一行覆盖至模式空间
N:	读取匹配到的行的下一行追加至模式空间
d:	删除模式空间中的行
D:	如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值