码迷,mamicode.com
首页 > 其他好文 > 详细

文本处理工具

时间:2016-08-10 01:02:42      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:文本处理   sed   grep   正则表达式   

1.文件查看相关命令
 (1)cat命令
  cat [OPTION]... [FILE]...
   -E:显示行结束符
   -n:对显示除的每一行进行编号
   -A:显示所有控制符
   -b:仅对非空行编号
   -s:压缩连续的空行成一行
 (2)tac命令
  倒序显示文件内容
 (3)rev命令
  rev f2反向显示文件的每一行内容
 (4)more命令
  分页查看文件
  more [OPTION...] FILE...
   -d:显示翻页及退出提示
   !COMMAND,执行完接着看文档
  支持查找等,但是仅能向下查找
 (5)less:一页页地查看文件或STDIN输出
  查看时有用的命令包括:
   /文本 搜索文本
   n/N 跳到下一个或上一个匹配项
   man命令中使用的分页器也是less
  
2.显示文本前或后行内容
 (1)head命令
  head [OPTION]... [FILE]...
   -c #:指定获取前#字节
   -n #:指定获取前#行
   -#  :指定行数
 (2)tail命令
  tail [OPTION]... [FILE]...
   -c #:指定获取后#行
   -n #:指定获取后#行
   -#  :指定获取后#行
   -f:跟踪显示文件新追加内容,常用于日志监控
   logger "this is a log test" :命令logger是触发产生日志的命令
   tail -n 0 -f /var/log/messages & 可边工作边动态显示日志变化情况
   
3.文本抽取和合并命令
 (1)cut [OPTION]... [FILE]...
  -d DELIMITER:指明分隔符,默认tab
  -f FILED:
   #:第#个字段
   #,#[#]:离散的多个字段,如:1,3,6
   #-#:连续的多个字段,例如:1-5
   混合使用:1-3,7
   -c 按字符切割
   --output-delimiter=STRING指定输出分隔符
   ifconfig中取
    ip:head -2 f2|tail -1 |cut -d ‘:‘ -f 2|cut -d ‘ ‘ -f 1
    CentOS7:ifconfig|head -2|tail -1|cut -d‘ ‘ -f 10
   取df中磁盘的使用率
    df |tr -s ‘ ‘|cut -d ‘ ‘ -f5|tr -d ‘%‘
    df |tr -s ‘ ‘|tr ‘ ‘ ‘:‘|cut -d‘:‘ -f5|tr -d "%"
   显示文件或STDIN数据的指定列
    cut -d: -f1 /etc/passwd
    cat /etc/passwd |cut -d: -f7
    cut -c2-5 /usr/share/dict/words
 (2)paste文本合并命令
  paste [OPTION]... [FILE]...
   -d 分隔符:指定分隔符,默认用tab
   -s:所有行合并成一行
   paste f1 f2
   paste -s f1 f2

4.分析文本的工具
 (1)搜集文本统计数据wc
   直接执行wc会显示文件的行数,字符数,单词数
   wc -l:显示文件行数
   wc -w:显示文件的单词数
   wc -c:显示文件的字节数
   wc -m:统计字符
 (2)文本排序sort
   把整理过的文本显示在STDOUT,不改变原始文件
   sort f2默认排序
   cat f1 |sort -n -t:-k3
   -n纯数字排序
   -r倒序排序
   -t指定分隔符
   -k指定排序位置
   -u删除重复行
 (3)uniq命令
   从输入中删除重复的前后相接的行
   uniq [OPTION]... [FILE]...
    -c:显示每行重复的次数
    -d:仅显示重复过的行
    -u:仅显示不重复的行
    在uniq中把连续且完全相同的才认为是重复
   常和sort命令一起配合使用:
    sort userlist.txt |uniq -c
    
 (4)diff比较文件
   比较两个文件之间的区别
    diff f1 f2
   diff 命令的输出被保存在一种叫做‘补丁’的文件中
    使用-u选项来输出‘统一的’diff格式文件,最适用于补丁文件。
   patch命令复制在其它文件中进行的改变(要谨慎使用)
    适用-b选项来自动备份改变了的文件
     diff -u f1 f2 > f.patch
     patch -b f1 f.patch
 (5)练习:
  1、找出ifconfig命令结果中本机的所有IPv4地址
   ifconfig|tr -cs ‘[0-9].‘ ‘\n‘|sort -ut ‘.‘ -k3
  2、查出分区空间使用率的最大百分比值
   df |tr -s ‘ ‘|tr ‘ ‘ ‘:‘|cut -d‘:‘ -f5|tr -d "%"|sort -n |tail -1
  3、查出用户UID最大值的用户名、UID及shell类型
   cat /etc/passwd|sort -n -t: -k3|tail -1|cut -d: -f1,3,7|tr ‘:‘ ‘\n‘
  4、查出/tmp的权限,以数字方式显示
   stat /tmp|head -4|tail -1|cut -d‘(‘ -f2|cut -d‘/‘ -f1
  5、统计当前连接本机的每个远程主机IP的连接数,并按从大到小排序
   netstat -nt|tr -s ‘ ‘|cut -d‘ ‘ -f5|sort|uniq -c|cut -d‘ ‘ -f 7|sort -n
   
   
5.grep文本过滤命令
 (1)grep:Global search REgular expression and Print out the line
   作用:文本搜索工具,根据用户指定的“模式”对目标文本逐行进行匹配检查,打印匹配到的行;
   模式:由正则表达式字符及文本字符所编写的过滤条件
 (2)grep [OPTIONS] PATTERN [FILE...]
   grep root /etc/passwd
   grep "$USER" /etc/passwd
   grep ‘$USER‘ /etc/passwd 这个强引用会使$符号无效
   grep `whoami` /etc/passwd

 (3)grep命令选项
   --color=auto:对匹配到的文本着色显示
   -v:显示不能够被pattern匹配到的行
   -i:忽略字符大小写
   -n:显示匹配的行数
   -c:统计匹配的行数
   -o:仅显示匹配到的字符串
   -q:静默模式,不输出任何信息
   -A # :after后#行
   -B #:before前#行
   -C #:context,前后各#行
   -e:实现多个选项之间的逻辑or关系
    grep -e ‘cat‘ -e ‘dog‘ file
   -w:整行匹配整个单词
   -E:使用扩展表达式
    grep -E=egrep
6.正则表达式
 (1)REGEXP:由一类特殊字符及文本字符所编写的模式,其中有些字符(元字符)不表示字符字面意义,而表示控制或通配的功能。
  程序支持:grep,vim,less,nginx等
  分类:
   基本正则表达式:BRE
   扩展正则表达式:ERE
    grep -E ,egrep
  正则表达式引擎:
   采用不同算法,检查处理正则表达式的软件模块
  元字符分类:字符匹配、匹配次数、位置锚定、分组
  获得更多关于正则表达式的信息:man 7 regex
 (2)基本正则表达式元字符
  字符匹配:
   .:匹配任意单个字符
   []:匹配指定范围内的任意单个字符
   [^]:匹配指定范围外的任意单个字符
   [:digit:]、[:lower:]、[:upper:]、[:alpha:]、[:alnum:]、[:punct:]、[:space:]
  匹配次数:
   用在要指定次数的字符后面,用于指定前面的字符出现的次数
   *:匹配前面的字符任意次,包括0次
    贪婪模式:尽可能长的匹配
   .*:任意长度的任意字符
   \?:匹配其前面的字符0或1次
   \+:匹配其前面的字符至少1次
   \{n\}:匹配前面的字符N次
   \{m,n\}:匹配前面的字符至少m次,至多n次
   \{,n\}:匹配前面的字符至多n次
   \{n,\}:匹配前面的字符至少n次
   
  位置锚定
   定位出现的位置
   ^:行首锚定,用于模式的最左侧
   $:行尾锚定,用于模式的最右侧
   ^PATTERN$:用于模式匹配整行
    ^$:空行
    ^[[:space:]]*$:空白行
   \<或\b:词首锚定,用于单词模式的左侧
   \>或\b:词尾锚定;用于单词模式的右侧
   \<PATTERN\>:匹配整个单词
  
  分组:
   \(\):将一个或多个字符捆绑在一起,当做一个整体进行处理,如:\(root\)\+
    分组括号中的模式匹配到的内容会被正则表达式的引擎记录于内部的变量中,这些变量的命名方式为
    :\1,\2,\3,...
   \1:从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符
    \(string\+\(string\)*\)
    \1:string\+\(string2\)*
    \2:string2
   后向引用:引用前面的分组括号中的模式所匹配字符(而非模式本身)
    示例:~]# grep "^\(.*\b\).*\/\1$" /etc/passwd
      sync:x:5:0:sync:/sbin:/bin/sync
      shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
      halt:x:7:0:halt:/sbin:/sbin/halt
 相关练习:
  1、显示/proc/meminfo文件中以大小s开头的行;(要求:使用两种方式)
   ~]# cat /proc/meminfo | grep -i ‘^S‘
   SwapCached:            0 kB
   SwapTotal:       2097148 kB
   SwapFree:        2097148 kB
   Shmem:               240 kB
   Slab:              64448 kB
   SReclaimable:      38424 kB
   SUnreclaim:        26024 kB
    ~]# cat /proc/meminfo | grep -e ‘^s‘ -e ‘^S‘
   SwapCached:            0 kB
   SwapTotal:       2097148 kB
   SwapFree:        2097148 kB
   Shmem:               240 kB
   Slab:              64448 kB
   SReclaimable:      38424 kB
   SUnreclaim:        26024 kB
   
  2、显示/etc/passwd文件中不以/bin/bash结尾的行
    ~]# cat /etc/passwd |grep -v ‘/bin/bash‘
   bin:x:1:1:bin:/bin:/sbin/nologin
   daemon:x:2:2:daemon:/sbin:/sbin/nologin
   adm:x:3:4:adm:/var/adm:/sbin/nologin
   lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
   sync:x:5:0:sync:/sbin:/bin/sync

  3、显示用户rpc默认的shell程序
    ~]# cat /etc/passwd|grep ‘\brpc\b‘ |cut -d : -f 7
   /sbin/nologin

  4、找出/etc/passwd中的两位或三位数
   ~]# cat /etc/passwd|grep ‘\b[[0-9][0-9][0-9]\?\b‘
   mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
   uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
   ~]# cat /etc/passwd|grep ‘\b[[0-9]\{2,3\}\b‘
   mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
   uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

  5、显示/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面存非空白字符的行
   ~]# cat /etc/grub2.cfg |grep ‘^[[:space:]]\+[^[:space:]]‘
      load_env
       set default="${next_entry}"
       set next_entry=

  6、找出“netstat -tan”命令的结果中以‘LISTEN’后跟任意多个空白字符结尾的行
   ~]# netstat -tan|grep ‘LISTEN[[:space:]]*‘
   tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN
   tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN
   tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN
   tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN
   tcp6       0      0 :::22                   :::*                    LISTEN
   tcp6       0      0 ::1:631                 :::*                    LISTEN
   tcp6       0      0 ::1:25                  :::*                    LISTEN
   tcp6       0      0 ::1:6010                :::*                    LISTEN
   [root@centos7 ~]#

  7、添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin),而后找出/etc/passwd文件中用户名同shell名的行
   ~]# cat /etc/passwd|grep "^\(.*\b\).*/\1$"
   sync:x:5:0:sync:/sbin:/bin/sync
   shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
   halt:x:7:0:halt:/sbin:/sbin/halt
   bash:x:1003:1005::/home/bash:/bin/bash
   nologin:x:1006:1008::/home/nologin:/sbin/nologin
    ~]# cat /etc/passwd|grep -E ‘^(.*):.*/\1$‘
   sync:x:5:0:sync:/sbin:/bin/sync
   shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
   halt:x:7:0:halt:/sbin:/sbin/halt
   bash:x:1003:1005::/home/bash:/bin/bash
   nologin:x:1006:1008::/home/nologin:/sbin/nologin

   
7.egrep及扩展的正则表达式
 egrep=grep -E
 egrep  [OPTIONS] PATERN [FILE...]
 扩展正则表达式的元字符
  字符匹配: 
   .:任意单个字符
   []:指定范围的字符
   [^]:不在指定范围的字符
  次数匹配:
   *:匹配前面字符任意次
   ?:0或1次
   +:1次或多次
   {m}:匹配m次
   {m,n}:至少m,至多n次
  位置锚定:
   ^:行首
   $:行尾
   \<,\b:词首
   \>,\b:词尾
  分组:
   ()
   后向引用:\1,\2,...
  或者:
   a|b
   C|cat:C或cat
   (C|c)at:Cat或cat
   
 练习题:
  1、显示三个用户root、mage、wang的UID和默认shell
    ~]# cat /etc/passwd|grep -E "^(root|mage|wang)"|cut -d: -f3,7
   0:/bin/bash
   1000:/bin/bash
   1009:/bin/bash

  2、找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行
   ~]# cat /etc/rc.d/init.d/functions |grep -E ‘^([[[:alpha:]]+|_])\(\)‘
   checkpid() {
   daemon() {
   killproc() {
   pidfileofproc() {
   pidofproc() {
   status() {
   success() {
   failure() {
   passed() {
   warning() {
   action() {
   strstr() {

   
  3、使用egrep取出/etc/rc.d/init.d/functions中其基名
    ~]# echo "/etc/rc.d/init.d/functions" | egrep -o ‘[^/]+/?$‘
   functions

  4、使用egrep取出上面路径的目录名
   ~]# echo "/etc/rc.d/init.d/functions" | egrep -o ‘/.*/‘
   /etc/rc.d/init.d/
   
  5、统计以root身份登录的每个远程主机IP地址的登录次数
   ~]# who |grep "^root"|egrep -o "\(.*\)"|cut -d ‘)‘ -f1|cut -d‘(‘ -f2|sort|uniq -c
   2 10.1.250.58

  6、利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255
   0-9:[0-9]; 10-99:[1-9][0-9] ; 100-199:1[0-9]{2};200-249:2[0-4][0-9];250-255:25[0-5]
  7、显示ifconfig命令结果中所有IPv4地址
    ~]# ifconfig|egrep -o ‘(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])‘
   10.1.249.36
   10.1.255.255
   255.255.0.0
   127.0.0.1
   255.0.0.0

   
  
8.sed文本处理工具
 Stream EDitor,行编辑器
 sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为
 “模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着
 处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出
 sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等
 
 用法:
  sed [option]... ‘script‘ inputfile...
 常用选项:
  -n:不输出模式空间内的自动打印
  -e:多点编辑
  -f:/path/to/script_file:从指定文件中读取编辑脚本(文件中写的是2p打印第二行)
  -r:支持使用扩展正则表达式
  -i:原处编辑(会真正改变源文件)sed -i.bak ‘2d‘ f1 删除的时候先备份
 script:
  ‘地址命令’
 地址定界:
  (1)不给地址:对全文进行处理
  (2)单地址:
   #:指定的行
   /pattern/:被此模式所能够匹配到的每一行
  (3)地址范围
   #,#
   #,+#
   /pat1/,/pat2/
   #,/pat1/
  (4)~:步进
   1~2 奇数行
   2~2 偶数行
 编辑命令:
  d:删除模式空间匹配到的行
  p:显示模式空间中的内容
  a \text:在行后面的下一行中追加文本;支持使用\n实现多行追加
  i \text:在行前面插入文本;支持使用\n实现多行插入
  c \text:替换行为单行或多行文本
  w /path/to/somefile:保存模式匹配的行至指定文件
  r /path/from/somefile:读取指定文件的文本至模式空间中匹配到的行后
  =:为模式空间中的行打印行号
  !:模式空间中匹配行取反处理
 s///:查找替换,支持使用其它分隔符号:s@@@,s###
 替换标记:
  g:行内全局替换
  p:显示替换成功的行
  w /path/to/somefile:将替换成功的行保存至文件中
 sed命令相关示例:
  (1)~]# sed ‘2p‘ /etc/passwd #打印第二行,由于sed本身处理会打印,故第二行打印两次
   root:x:0:0:root:/root:/bin/bash
   bin:x:1:1:bin:/bin:/sbin/nologin
   bin:x:1:1:bin:/bin:/sbin/nologin
   daemon:x:2:2:daemon:/sbin:/sbin/nologin
  (2)
   ~]# sed -n ‘2p‘ /etc/passwd  #-n仅显示匹配到的行,即第二行
   bin:x:1:1:bin:/bin:/sbin/nologin
  (3)
   ~]# sed -n ‘1,4p‘ /etc/passwd #打印1到第四行
   root:x:0:0:root:/root:/bin/bash
   bin:x:1:1:bin:/bin:/sbin/nologin
   daemon:x:2:2:daemon:/sbin:/sbin/nologin
   adm:x:3:4:adm:/var/adm:/sbin/nologin

  (4)
    ~]# sed -n ‘/root/p‘ /etc/passwd  #打印行中带root的行
   root:x:0:0:root:/root:/bin/bash
   operator:x:11:0:operator:/root:/sbin/nologin
  (5)
   ~]# sed -n ‘2,/root/p‘ /etc/passwd #打印第二行向后到行中带root的行
   bin:x:1:1:bin:/bin:/sbin/nologin
   daemon:x:2:2:daemon:/sbin:/sbin/nologin
   adm:x:3:4:adm:/var/adm:/sbin/nologin
   lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
   sync:x:5:0:sync:/sbin:/bin/sync
   shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
   halt:x:7:0:halt:/sbin:/sbin/halt
   mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
   uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
   operator:x:11:0:operator:/root:/sbin/nologin

  (6)
   ~]# sed -n ‘/^$/=‘ /etc/fstab #显示空行的行号
   1
  (7)
   ~]# sed -n -e ‘/^$/p‘ -e ‘/^$/=‘ /etc/fstab #一次执行多个操作,用-e分别区分每个操作

   1
  (8)
    ~]# sed ‘/root/a\superman‘ /etc/passwd #在匹配到的行的下方追加内容
   root:x:0:0:root:/root:/bin/bash
   superman
  (9)
    ~]# sed ‘/root/i\superman‘ /etc/passwd #在匹配行的上一行添加
   superman
   root:x:0:0:root:/root:/bin/bash
   bin:x:1:1:bin:/bin:/sbin/nologin
  (10)
    ~]# sed ‘/root/c\superman‘ /etc/passwd #替换匹配到的行中的内容
   superman
   bin:x:1:1:bin:/bin:/sbin/nologin
   daemon:x:2:2:daemon:/sbin:/sbin/nologin

 练习题: 
  1、删除/etc/grub2.conf文件中所有以空白开头的行行首的空白字符
    ~]# cat /etc/grub2.cfg |sed ‘s/^[[:space:]]\+//‘
  2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符
    ~]# cat /etc/fstab |sed -r ‘s@^#[[:space:]]+@@‘
  3、在/root/install.log每一行行首增加#号
    ~]# cat /root/install.log|sed ‘s@^@#@‘
  4、在/etc/fstab文件中不以#开头的行的行首增加#号
   ~]# cat /etc/fstab |sed "s@^[^#]@#&@"
  5、处理/etc/fstab路径,使用sed命令取出其目录名和基名
   取目录名:
    ~]# echo "/etc/" |sed -r "s@(.*/)[[:alnum:]]+/?@\1@"
   取基名:
     ~]# echo "/etc/" |sed -r "s@.*/([[:alnum:]]+/?)@\1@"
  6、利用sed 取出ifconfig命令中本机的IPv4地址
    ~]# ifconfig |sed -n ‘/Bcast/p‘|sed -r ‘s/.*:(.*) B.*/\1/‘
    10.1.249.36
  7、统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个字段的重复次数
   Packages]# ls | sed -r ‘s/.*\.([^\.]+)\.rpm/\1/‘|sort|uniq -c
       1 _1
       1 1asfh
       1561 i686
       1448 noarch
       1 TRANS.TBL
       3687 x86_64
 
 sed的高级编辑命令:
  h:把模式空间中的内容覆盖至保持空间中
  H:把模式空间中的内容追加至保持空间中
  g:从保持空间取出数据覆盖至模式空间
  G:从保持空间中取出内容追加到模式空间中
  x:把模式空间中的内容与保持空间中的内容进行互换
  n:读取匹配到的行的下一行覆盖至模式空间
  N:追加匹配到的行的下一行至模式空间
  d:删除模式空间中的行
  D:删除当前模式空间开端至\n的内容(不再传至标准输出),放弃之后的命令,但是对
   剩余模式空间重新执行sed
  
 sed高级编辑的示例
  sed -n ‘n;p‘ FILE #显示偶数行,读第一行后把第二行读入把1覆盖,此时仅剩2,依次类推
  sed ‘1!G;h;$!d‘ FILE #倒序排列
  sed ‘$!N;$!D‘ FILE #仅显示最后两行    
  sed ‘$!d‘ FILE #显示最后一行
  sed ‘G’ FILE #每行后面加一行空格
  sed ‘g’ FILE #把文件中的每行替换为空行
  sed ‘/^$/d;G’ FILE #每行后面加一行空格
  sed ‘n;d‘ FILE #显示奇数行
  sed -n ‘1!G;h;$p‘ FILE  #倒序显示

本文出自 “11880696” 博客,请务必保留此出处http://11890696.blog.51cto.com/11880696/1836316

文本处理工具

标签:文本处理   sed   grep   正则表达式   

原文地址:http://11890696.blog.51cto.com/11880696/1836316

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!