文本处理工具笔记

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  #倒序显示

    

原创文章,作者:提着酱油瓶打醋,如若转载,请注明出处:http://www.178linux.com/32335

(0)
提着酱油瓶打醋提着酱油瓶打醋
上一篇 2016-08-10
下一篇 2016-08-10

相关推荐

  • 第六次作业

    1 、取本机ip地址 Centos6.8 ifconfig | head -2|tail -1|cut -d: -f2|cut -d" " -f1 ifconfig | head -2|tail -1|cut&…

    学员作品 2016-08-10
  • 马哥教育网络班20期+第11周课程练习

    1、详细描述一次加密通讯的过程,结合图示最佳。 2、描述创建私有CA的过程,以及为客户端发来的证书请求进行办法证书。 3、描述DNS查询过程以及DNS服务器类别。 4、搭建一套DNS服务器,负责解析magedu.com域名(自行设定主机名及IP) (1)、能够对一些主机名进行正向解析和逆向解析; (2)、对子域cdn.magedu.com进行子域授权,子域负…

    学员作品 2016-09-05
  • Linux 用户,组和用户权限的使用

    echo -e "Hello,I am 'whoami',the system version is here,please helcheck ist  thanks! \n'lsb_release'"| mail -s 'help'root cmd1 |cmd 2 cma1 2&…

    2016-08-05
  • 马哥教育网络班20期+第10周课程练习

     1. 请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情) 1. 加电自检:POST     通电后主板CMOS中的BIOS(基本输入输出系统)将进行硬件自检并简单设置,根据硬盘等     相关设备情况进入下一步   &…

    学员作品 2016-08-15
  • 关于文本处理工具之SED

                                                      &nbsp…

    学员作品 2016-08-10
  • 马哥教育网络班20期-第八周课程作业

    1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。 网桥将两个相似的网络连接起来,并对网络数据的流通进行管理。它工作于数据链路层,不但能扩展网络的距离或范围,而且可提高网络的性能、可靠性和安全性。 集线器的英文称为“Hub”。主要功能是对接收到的信号进行再生整形放大,以扩大网络的传输距离,同时把所有节点集中在以它为中心的节点上。它…

    学员作品 2016-09-08