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

一、*各种文本处理工具

1.1抽取文本的工具

1.1.1 catless查看文本内容

   morelesscat 【选项 【文件

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

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

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

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

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

1.1.2 headtail文件截取

    headtail  【选项 【文件

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

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

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

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

1.1.3 cutpaste按列抽取

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

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

-f #:第#个字段 f ##:离散的多个字段,例如136

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

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

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

    paste  f1  f2   paste  –s  f1  f2

1.1.4 wcsort分析文本的工具

    wcsort diffpatch

文本数据统计:

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

文本排序:sort 【选项 files

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

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

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

1.1.5 uniq文本压缩工具

   uniq  选项】 file

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

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

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

1.1.6 diffpatch比较文件的区别

例如 $  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文本处理三剑客

   grepsedawk

sedstream editor,文本编辑工具

awkLinux上的实现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#  -Ccontext,前后#

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

         通配的功能程序支持:grepvimlessnginx

正则表达式引擎man 7 regex

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

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

2.1.1字符匹配(文本内容)                     

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

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

2.1.2匹配多次

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

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

           gooo*gle 相当于 goo\+gle

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

\{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|ba或者b     C|cat C或者cat    C|catCat或者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/:匹配到part1part2之间的行显示

    #,/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 1015w  f2显示/etc/passwd内容,但是把10-15行的内容写到f2中去。

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

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

cat -n /etc/passwd | sed  -n ‘1015r  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 /^$/dfile     显示file中的非空白行

vsed 1,10dfile    显示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文本中testmytest

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

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

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

vsed  -i.baks/dog/cat/gpets   备份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 GFILE  保持模式先为空的 ;追加到模式空间 ;就会形成模式空间每行之间有空格,再显示出来

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

v sed /^$/d;GFILE 显示除空格之外的偶数行

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

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

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

相关推荐

  • 文件系统结构

    -文件系统结构
    -应用程序的组成部分
    -文件类型

    2018-03-13
  • 网络管理、进程管理、计划任务及启动流程

          网络管理 一.网卡模块操作步骤: 查询网卡模块类型:ethtool  -i  eth1 查询网卡模块lsmod |grep e1000 删除网卡模块rmmod e1000  或者modprobe  -r  e1000 添加网卡模块 modprobe e1000 删除模…

    Linux干货 2016-09-08
  • 系统启动和内核管理(一)

    系统启动和内核管理(一)   (以CentOS5/6为例) 一、Linux的组成: 1、Linux:kernel+rootfs kernel:进程管理、内存管理、网络管理、驱动程序、文件系统、安全功能。 rootfs:程序和glibc 库:函数集合,function,调用接口(头文件负责描述); 过程调用,procedure,无返回值; 函数调用,…

    Linux干货 2016-09-10
  • 练习

    练习 显示/proc/meminfo文件中以大小s开头的行;     显示/etc/passwd文件中不以/bin/bash结尾的行     找出/etc/passwd中的两位或三位数     显示/etc/grub2.cfg文件中,至少以一个空白字符开头的 且后面存非空白字符的行   &…

    Linux干货 2016-08-12
  • Openssl——为你的信息保驾护航

    OpenSSL基础 ·传输层协议:TCP,UDP,SCTP         port:进程地址,进程向内核注册使用某端口(独占) ·同一主机上的进程间通信:IPC,message queue,shm,semerphor ·不同主机上的进程间通信:socket  &nbs…

    Linux干货 2016-09-22
  • shell脚本的练习

    1、写一个脚本,使用ping命令探测172.16.250.1-172.16.250.254之间的所有主机的在线状态1、写一个脚本,使用ping命令探测172.16.250.1-172.16.250.254之间的所有主机的在线状态  在线的主机使用绿色显示  不在线的主机使用红色显示 #!/bin/bash for i in {1..254};do { ip=…

    2017-09-17