文本处理工具及正则表达式

一、*各种文本处理工具

1.1抽取文本的工具

1.1.1 cat、less查看文本内容

   more、less和cat 【选项】 【文件】

cat  –n ,-d列行 ,-A:显示所有看不见的符号(控制符),

    -E:显示结尾$ ;-s:压缩连续空行为一行

more  –d:显示翻页及退出提示

less:一页一页查看文件或标准输出

   /文本:搜索文本   n/N:跳到下一个 或上一个匹配

1.1.2 head、tail文件截取

    head和tail  【选项】 【文件】

  head –c #:指定获取前#个字节  ;  -n #;-#:指定获取前#行

    tail –c #:指定获取后#字节  ; -n #;-#:指定获取后#行

      -f:跟踪显示文件新追加的内容。常用于日志监控

例如:tail –n0 –f f2 &  后台显示跟踪日志  fg 1打断

1.1.3 cut、paste按列抽取

    cut 和 paste 合并文件:【选项】 【文件】

   cut  -d:指明分隔符,默认为tab;常与-f一起使用;-c:按字符切割

-f #:第#个字段; –f #,#:离散的多个字段,例如1,3,6

-f #-#:连续的多个字段,例如1-5  ;混合使用:1-3,7

    paste:合并两个文件同行号的列到一行

-d:指明分隔符,默认为tab ;-s:所有行合成为一行显示

    paste  f1  f2   ;paste  –s  f1  f2

1.1.4 wc、sort分析文本的工具

    wc、sort 、diff和patch

文本数据统计:

    wc  -l:统计行数  ; -w:统计单词总数  ;-c:统计字节数

文本排序:sort 【选项】 files

   sort  -r:执行反方向(由上至下)整理  -n:执行按数字大小整理

  -f:忽略字符串中的字符大小写      -u:删除输出中的重复行

  -t c:选项用c作为字符界定符  -k X:c字符分隔的X列整理  常用-t -k 一起使用排序

1.1.5 uniq文本压缩工具

   uniq  【选项】 【file】

uniq –c:显示每行重复出现的次数 ;  -d:仅显示重复过的行

-u:仅显示不重复的行   注:连续且完全相同的方为重复。

    常与sort命令一起使用 :sort userlist.txt | uniq -c

1.1.6 diff、patch比较文件间的区别

例如: $  diff  foo.conf-broken  foo.conf-works

      输出结果为:5c5  注:第5行有改变

   <  use_widgets =no    ;  >  use_widgets =yes

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

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

patch :命令复制在其他文件中进行的改变(要谨慎使用!)

patch  -d:自动备份改变了的文件 

例如: $ diff  –u  foo.conf-broken  foo.conf-works > foo.patch

       $ patch  -b  foo.conf-broken  foo.patch

reset:重置,重生成

二、Linux文本处理三剑客

   grep、sed、awk

sed:stream editor,文本编辑工具

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

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

2.1 grep文本过滤工具

       grep:Grobal search Regular expression and Print out the line

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

grep 【选项】pattern 【file】

-n:搜索并显示所在文本内容的行号;   -o:只显示匹配到的字符;  –i:忽略字符的大小写

-v:只显示不能被pattern匹配到的行;   –e:表示或者,实现多个逻辑关系如grep –e “cat” –e “ls” file

-c:计算查找“字符串”的次数;    –A #:after,后#行  ;-B #:before,前#行  ;-C:context,前后各#行

REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不代表字符表面的意义,而表示控制       

         或通配的功能;程序支持:grep、vim、less、nginx

正则表达式引擎(man 7 regex)

     采用不同的算法,检查出路正则表达式的软件模块PCRE(Perl Compatible Regular Expressions)

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

2.1.1字符匹配(文本内容)                     

.:匹配任意单个字符                     []:匹配指定范围内的任意单个字符         

[^]:匹配指定范围外的任意单个字符       [^/]+/?$:取基名

2.1.2匹配多次

*:匹配符号*前面字符任意次,包括0次   .*:匹配任意长度的任意字符,不包括:等特殊符号

\?:匹配前面的字符0次或者1次          \+:匹配前面的字符至少1次

           gooo*gle 相当于 goo\+gle

\{n\}:匹配前面的字符n次                 \{m,n\}:匹配前面的字符【m,n】次

\{1,\}相当于\+

2.1.3位置锚定

^:行首锚定(开头的行)     $:行尾锚定(结尾的行)    ^$:空行   ^[[:space:]]*$:空白行

\<:单词限定词首;          \>:单词限定词尾            \<pattern\>:匹配整个单词

分组:\(\)将一个或多个字符捆绑在一起

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

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

实例: \(string1\+\(string2\)*\)   (\1|\2 )       \1: string1\+\(string2\)*       \2: string2

    后向引用:引用前面的分组括号中的模式所匹配字符  : \(r..t).*\(r..t\)  与\(r..t).*\1   是不同的

字母字符串后面如果有数字和下划线那就锚定不了

转义:\. 就表示.字符,而不是代表任意字符

三、*正则表达式

 

文本处理工具及正则表达式

egrep及扩展的正则表达式 ;与grep功能差不多,就是正则表达式少了\。

或者: a|b:a或者b   ;  C|cat: C或者cat    ;(C|c)at:Cat或者cat

3.1 文件名通配符

*:匹配零个或多个字符 ;  ?:匹配任何单个字符;  ~:当前用户家目录; ~mage:用户mage 家目录

~+ :当前工作目录  ~—: 前一个工作目录

[0-9] 匹配数字范围;  [a-z] :字母;   [A-Z] :字母 ;   [wang] 匹配列表中的任何的一个字符

v [^wang]  匹配列表中的所有字符以外的字符

预定义的字符类:(#man 7 glob)帮助文件

[:digit:] :任意数字,相当于0-9  ;  [:lower:] :任意小写字母

[:upper:]:  任意大写字母         ;  [:alpha:]:  任意大小写字母

[:alnum:] :任意数字 或字    ;  [:blank:] :水平空白字符    ;  [:space:]:水平或垂直的空白字符

四、*sed 行编辑器

sed介绍、sed用法、sed高级用法

stream EDitor,  行编辑器 ,自带一些编程语言 ,可以直接对文件修改,故一般用管道传递给sed

v   sed 是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space ),接着用sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed 主要用来自动编辑一个或多个文件, 简化对文件的反复操作, 编写转换程序等。

用法:sed  [option] …  'script'  inputfile…  支持正则表达式

4.1常用选项

-n :不输出模式空间内容到屏幕,即不自动打印  ;  -e:  多点编辑;多次编辑

-f :/ PATH/SCRIPT_FILE :  从指定文件中读取编辑脚本

-r:  支持使用扩展正则表达式  ;  -i:  原处编辑,直接修改建议-i.bak,先备份.bak后 (显示修改的内容,修改                                                                                            前的内容在file.bak中)

4.2 script ' 地址命令'

  地址定界: (一般加上-n,要不然显示2遍)

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

(2)  单地址:  #:  指定的行    ;    /pattern/ :被此处模式所能够匹配到的每一行

(3)  地址范围:

    #1,#2:从第#1行到#2行  ;  #,+#    ;  /pat1/,/pat2/:匹配到part1到part2之间的行显示

    #,/pat1/ :匹配第#行到匹配part之间行的显示

    ~ :步进  1~2  显示奇数行    2~2   显示偶数行

4.3 编辑命令

    ’script’  地址定界用在’script前’

   d:  删除模式空间匹配的行;   例如:‘  d‘删除有空格的行 ,也可以用全局替换

   p:  显示模式空间中的内容 , -n ‘10P’:仅显示第10行,相当于head -10|tail -1;

         (没有-n的话,模式空间所有的文本都显示,10行出现2次);

a [\]text :在指定行 后面追加文本  \n,可以追加两行至几行 ;支持 使用\n 实现多行追加  

   cat -n /etc/passwd | sed ‘10a\wwwww\nrrrrrr’ 显示/ect/passwd文本,并在第10行后面插入wwwww  两行

i [\]text :在行前面 插入文本          ;与上述差不多不过是第10行行前插入。           rrrrr

c [\]text :替换行为单行或多行文本     ;与上述差不多不过是替换第10行插入。

         w  /path/somefile:  保存模式匹配的行至指定文件

     cat -n /etc/passwd | sed ‘10,15w  f2’显示/etc/passwd内容,但是把10-15行的内容写到f2中去。

 r /path/somefile :读取指定文件的文本至模式空间中匹配到的行后面

 cat -n /etc/passwd | sed ‘10,15r  f2’显示/etc/passwd内容,并在10-15行每一行后面插入显示f2的内容。

cat -n /etc/passwd | sed  -n ‘10,15r  f2’,仅显示/etc/passwd文本10-15行每行后面插入显示f2的文本内容。

   =:  为模式空间中的行打印行号  ; cat f1 |sed -n '/root/=' 仅显示f1文本中含有root的行号

                            cat f1 |sed  '/root/='  显示f1文本内容 ,并在root所在行上面显示行号

  !: 模式空间中匹配行取反处理    ;cat f1 |sed -n '/root/!=' 仅显示f1文本中不含有root的行号

  cat f1 |sed  '/root/!='  显示f1不含有root行的文本内容 ,并在显示的所在行上面显示行号

4.4 查找替换

   s/// :查找替换, 支持使用其它分隔符,s@@@ ,s###  (不支持编辑命令)

  cat  /etc/passwd | sed  ‘s/root/ROOT/’:把/etc/passwd文本中每一行第一个匹配到的root 替换为ROOT

v  替换标记:  g:  行内全局替换  ;p:  显示替换成功的行

   w  /PATH/TO/SOMEFILE :将替换成功的行保存至文件中

4.5 sed普通命令示例

  sed ‘2p’ /etc/passwd    显示/etc/passwd 所有内容,并再打印第二行显示

vsed –n ‘2p’ /etc/passwd   仅显示/etc/passwd 文本第2行的内容

vsed –n ‘1,4p’ /etc/passwd   仅显示/etc/passwd 文本第1-4行的内容

vsed –n ‘/root/p’ /etc/passwd  仅显示/etc/passwd 文本含有root行的内容

vsed –n ‘2,/root/p’ /etc/passwd  仅显示/etc/passwd 文本从第2 行随后第一个匹配到root的行

vsed  -n ‘/^$/=’ file               仅显示file文本空行行号

vsed –n –e ‘/^$/p’ –e ‘/^$/=’ file  仅显示空白行和空白行号

vsed ‘/root/a\superman’ /etc/passwd 行后  在/etc/passwd文本含有root的行行后显示superman

vsed ‘/root/i\superman’ /etc/passwd  行前   在/etc/passwd文本含有root的行行后显示superman

vsed ‘/root/c\superman’ /etc/passwd  代替行   在/etc/passwd文本含有root的行替换为superman

vsed ‘/^$/d’ file     显示file中的非空白行

vsed ‘1,10d’ file    显示file文本中除1-10行的所有的行

vnl  /etc/passwd | sed ‘2,5d’  显示/etc/passwd文本中除2-5行外所有的行和行号

vnl  /etc/passwd | sed ‘2a tea’  显示/etc/passwd文本中所有行号及文本,并在第2行后插入tea

vsed  's/test/mytest/g'  file       替换file文本中test为mytest

sed -n‘s/root/&superman/p’ /etc/passwd 单词后:仅显示/etc/passwd文本中root的行并把root替换为rootsuperman

sed -n ’s/root/superman&/p’/etc/passwd 单词前:仅显示/etc/passwd文本中root的行并把root替换为supermanroot

vsed  -e‘s/dog/cat/’-e ‘s/hi/lo/’pets  把pets文本每一行第一个匹配的dog换成cat ;hi换成lo

vsed  -i.bak‘s/dog/cat/g’pets   备份pets文本为pets.bak,并把pets文本中dog全部替换成cat显示出来

4.6 sed 工具   

v  高级编辑命令:(模式空间,保持空间)

h:  把模式空间中的内容覆盖至保持空间中

H :把模式空间中的内容追加至保持空间中

g:  从保持空间取出数据覆盖至模式空间

G :从保持空间取出内容追加至模式空间

x:  把模式空间中的内容与保持空间中的内容进行互换

n:  读取匹配到的行的下一行 覆盖 至模式空间

N :读取匹配 到的行的 下一行 追加 至 模式空间

d:  删除模式空间中的行

D :删除 当前模式空间开端至\n 的内容 ( 不再传 至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed

4.7 sed高级编辑命令示例

v sed -n 'n;p' FILE  仅显示file的偶数行

v sed '1!G;h;$!d' FILE  把file文本倒叙显示 相当于tac file

v sed '$!N;$!D' FILE  显示file文本最后2行 相当于tail -2

v sed '$!d' FILE  仅显示file文本最后1行 相当于tail -1

v sed ‘G’ FILE  保持模式先为空的 ;追加到模式空间 ;就会形成模式空间每行之间有空格,再显示出来

v sed ‘g’ FILE   保持模式先为空的 ;覆盖模式空间 ;就会形成模式空间都为空格,再显示出来一片空白

v sed ‘/^$/d;G’ FILE 显示除空格之外的偶数行

v sed 'n;d' FILE  仅显示奇数行

原创文章,作者:lyx,如若转载,请注明出处:http://www.178linux.com/60550

赞 (0)
lyxlyx
上一篇 2016-11-23 20:30
下一篇 2016-11-23 20:53

相关推荐

  • 第一周记录

    列出Linux的发行版,描述不同发行版之间的联系与区别。    发行版多达100多种,其中主要的有Debian旗下的Ubuntu、knopix,Slackware旗下的S.u.S.E,RedHat公司旗下的RedHat、CentOS、Fedora。其中各个版本之间的区别:包管理器的区别;但其内核都是Linux内核。 ifconfig: 查…

    Linux干货 2016-08-15
  • find文件查找

    文件查找      在文件系统上查找符合条件的文件:      实现工具:locate,find locate:      构建于实现构建好的索引库:/var/lib/mlocate/mlocate.db   &nbsp…

    Linux干货 2016-08-22
  • 马哥教育网络班20期+第2周课程练习

    1、Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。  文件管理类命令有ls,cat,touch,stat,cp,mv,rm等  ls:查看文件,其使用方法以及常用选项有: Usage: ls [OPTION]… [FILE]… 常用选项:   -a:列出所有内容,包括.和.. &…

    Linux干货 2016-06-23
  • ipvsadm配置命令

    Ipvsadm配置   ipvsadm/ipvs: 集群和集群之上的各RS是分开管理的; 集群定义 RS定义 ipvs:内核基本都自动编译上了 ~]# grep -i -C 10 “ipvs” /boot/config-VERSION-RELEASE.x86_64     支持的协议:…

    Linux干货 2017-05-17
  • 任务计划2

    [root@localhost app]# cat /etc/crontab SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin:/root/bin MAILTO=root   # For details see man 4 crontabs   # Example of job defi…

    Linux干货 2017-05-15
  • Linux系统程序包管理之RPM

    rpm包概述 RPM 是 Red at Package Manager 的缩写,本意是Red Hat 软件包管理,顾名思义是Red Hat 贡献出来的软件包管理工具;在Fedora 、Redhat、Mandriva、SuSE、YellowDog等主流发行版本,以及在这些版本基础上二次开发出来的发行版采用。 RPM包里面都包含什么?里面包含可执行的二进制程序,…

    Linux干货 2016-08-24