class7 文本处理命令及文本处理工具grep

一、文本处理命令

  1、文件内容查看cat, tac,rev

    cat [OPTION]… [FILE]…      正序查看文本文件

         -E:  显示行结束符$

[root@6 ~]# cat -E a.txt
Filesystem     1K-blocks    Used Available Use% Mounted on$
$
$
/dev/sda2       50264772 4064872  43639900   9% / $
tmpfs             502068      80    501988   1% /dev/shm$
/dev/sda1         194241   34211    149790  19% /boot$
/dev/sda3       20027260  333392  18669868   2% /testdir$
/dev/sr0         3824484 3824484         0 100% /media/CentOS_6.8_Final$

          -n:  对显示出的每一行进行编号

[root@6 ~]# cat -n a.txt
    1	Filesystem     1K-blocks    Used Available Use% Mounted on
    2
    3
    4	/dev/sda2       50264772 4064872  43639900   9% /
    5	tmpfs             502068      80    501988   1% /dev/shm
    6	/dev/sda1         194241   34211    149790  19% /boot
    7	/dev/sda3       20027260  333392  18669868   2% /testdir
    8	/dev/sr0         3824484 3824484         0 100% /media/CentOS_6.8_Final

          -A :显示所有控制符

[root@6 ~]# cat -A a.txt
Filesystem     1K-blocks    Used Available Use% Mounted on$
$
$
/dev/sda2       50264772 4064872  43639900   9% / $
tmpfs             502068      80    501988   1% /dev/shm$
/dev/sda1         194241   34211    149790  19% /boot$
/dev/sda3       20027260  333392  18669868   2% /testdir$
/dev/sr0         3824484 3824484         0 100% /media/CentOS_6.8_Final$

          -b: 非空行编号

[root@6 ~]# cat -b a.txt
    1	Filesystem     1K-blocks    Used Available Use% Mounted on
    2	/dev/sda2       50264772 4064872  43639900   9% /
    3	tmpfs             502068      80    501988   1% /dev/shm
    4	/dev/sda1         194241   34211    149790  19% /boot
    5	/dev/sda3       20027260  333392  18669868   2% /testdir
    6	/dev/sr0         3824484 3824484         0 100% /media/CentOS_6.8_Final

          -s :压缩连续的空行成一行

[root@6 ~]# cat -s a.txt
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda2       50264772 4064872  43639900   9% /
tmpfs             502068      80    501988   1% /dev/shm
/dev/sda1         194241   34211    149790  19% /boot
/dev/sda3       20027260  333392  18669868   2% /testdir
/dev/sr0         3824484 3824484         0 100% /media/CentOS_6.8_Final

      tac [OPTION]… [FILE]…   逆序查看文本文件

[root@6 ~]# tac a.txt
/dev/sr0         3824484 3824484         0 100% /media/CentOS_6.8_Final
/dev/sda3       20027260  333392  18669868   2% /testdir
/dev/sda1         194241   34211    149790  19% /boot
tmpfs             502068      80    501988   1% /dev/shm
/dev/sda2       50264772 4064872  43639900   9% /
Filesystem     1K-blocks    Used Available Use% Mounted on

      rev [options] [file …]         以字符为单位逆序输出文本文件

            [root@6 ~]# rev a.txt
no detnuoM %esU elbaliavA desU    skcolb-K1     metsyseliF
/ %9   00993634  2784604 27746205       2ads/ved/
mhs/ved/ %1   889105    08      860205             sfpmt
toob/ %91  097941    11243   142491         1ads/ved/
ridtset/ %2   86896681  293333  06272002       3ads/ved/
laniF_8.6_SOtneC/aidem/ %001 0         4844283 4844283         0rs/ved/


   2、分页查看文件内容

    more:  分页查看文件

     more [OPTIONS…] FILE…

         -d:  显示翻页及退出提示

        ! command  :临时执行命令 ,enter 退出

      less :一页一页地查看文件或STDIN 输出      man帮助命令查看分页器

      查看时有用的命令包括:

           /文本  搜索 文本

          n/N 个 跳到下一个 or  上一个匹配

class7   文本处理命令及文本处理工具grep

2016-8-5 1.gif

 


3、 显示文本前或后行内容

     head    正序截取文本文件

       head [OPTION]… [FILE]…

            -c #:  指定获取前# 字节

            -n #:  指定获取前#行

            -#: :  指定行数

[root@6 ~]# head -2 a.txt
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda2       50264772 4064872  43639900   9% /
[root@6 ~]# head -n2 a.txt
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda2       50264772 4064872  43639900   9% /
[root@6 ~]# head -c 10 a.txt
Filesystem[root@6 ~]#

     tail       倒序截取文本文件

       tail [OPTION]… [FILE]…

            -c #:  指定获取后# 字节    

            -n #:  指定获取后#行

             -#:

[root@6 ~]# tail -2 a.txt
/dev/sda3       20027260  333392  18669868   2% /testdir
/dev/sr0         3824484 3824484         0 100% /media/CentOS_6.8_Final

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

                #logger  “This is mine.”生成新日志

                # tail -n 0 -f  /var/log/messages &    后台执行的,当有新信息通知

2016-8-5 2.gif

       

class7   文本处理命令及文本处理工具grep


   4、按列抽取文本cut 和合并文件paste

      cut [OPTION]… [FILE]…

        -d DELIMITER:  指明分隔符,默认tab

        -f FILEDS:

        #:  第# 个字段

        #,#[,#] :离散的多个字段,例如1,3,6

        #-# :连续的多个字段,  例如1-6

        混合使用:1-3,7

[root@6 ~]# cut -d: -f1-3,7  pass    ##-d -f 两个选项经常搭配使用
root:x:0:/bin/bash
bin:x:1:/sbin/nologin
daemon:x:2:/sbin/nologin
adm:x:3:/sbin/nologin
lp:x:4:/sbin/nologin
sync:x:5:/bin/sync

        -c 按字符切割

           # cut -c 44-46    f1

[root@6 ~]# cut -c 10-20 pass
0:root:/roo
:bin:/bin:/
2:2:daemon:
:adm:/var/a
lp:/var/spo

         –output-delimiter=STRING 指定输出(修改)分隔符

[root@6 ~]# cut -d: -f1-3 --output-delimiter=+1 pass
root+1x+10
bin+1x+11
daemon+1x+12
adm+1x+13
lp+1x+14
sync+1x+15
shutdown+1x+16

         显示文件或STDIN 数据的指定列

           cut -d: -f1 /etc/passwd

[root@6 ~]# cut -d: -f1 /etc/passwd
root
bin
daemon
adm
lp
sync
shutdown
halt
mail
uucp
operator
games
gopher

          cat /etc/passwd | cut -d: -f7

[root@6 ~]# cat /etc/passwd | cut -d: -f7
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/bin/sync
/sbin/shutdown
/sbin/halt
/sbin/nologin
/sbin/nologin

           cut -c2-5 /usr/share/dict/words

[root@6 ~]# cut -c2-5 /usr/share/dict/words |tail -10
ythi
ythu
yzom
yzzo
yzzy
yzzy
Z
z
Zt
ZZ
获取ip
[root@6 ~]# ifconfig|head -2 | tail -1 |cut -d : -f 2
10.1.252.177  Bcast
仅显示磁盘利用率
[root@6 ~]# df | tr -s ' '|tr -d '%'|cut -d ' '-f 5
Use
9
1
19
2
100

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

        paste [OPTION]… [FILE]…

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

            -s :  所有行合成一行显示

            paste f1 f2

            paste -s f1 f2

[root@6 ~]# cat f1
123
456
789
[root@6 ~]# cat f2
abc
def
hij
[root@6 ~]# paste f1 f2
123	abc
456	def
789	hij
[root@6 ~]# paste -s f1 f2
123	456	789
abc	def	hij


  5、收集文本统计数据wc

        计数单词总数、行总数、字节总数和字符总数

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

        $ wc story.txt

        39     237      1901      story.txt

                   行数    字数    字符数

        使用 -l 来只计数行数    

        使用 -w 来只计数单词总数

        使用 -c 来只计数字节总数

        使用 -m 来只计数字符总数

[root@6 ~]# wc pass
 52   71 2390 pass
[root@6 ~]# wc -l pass
52 pass
[root@6 ~]# wc -w pass
71 pass
[root@6 ~]# wc -c pass
2390 pass
[root@6 ~]# wc -m pass
2390 pass


   6、文本排序sort和去重uniq

       把整理过的文本显示在STDOUT ,不改变原始文件

         $ sort [options] file(s)

       常用选项

         -r 执行反方向(由上至下)整理(r不能出现在尾部)sort  -rk  3  

         -n 执行按数字大小整理

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

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

[root@6 ~]# sort -t: -unrk 2 a
b:34
b:23
a:12
a:1
[root@6 ~]# cat a
a:12
b:23
a:1
b:34
A:1
a:1
A:12

        

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

         -k X 选项按照使用c 字符分隔的X列来整理能够使用多次

            ****-t -k 常搭配

[root@6 ~]# sort -t: -nrk 3  pass    
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
wang:x:4328:4329::/home/wang:/bin/bash
mage:x:4327:4328::/home/mage:/bin/bash
nologin:x:4326:4327::/home/nologin:/bin/bash
basher:x:4325:4326::/home/basher:/bin/bash

       uniq

        uniq 命令:从输入中删除重复的前后相接的行

          uniq [OPTION]… [FILE]…

                -c:  显示每行重复出现的次数;

[root@6 ~]# cat a
a:12
b:23
a:1
b:34
A:1
a:1
A:12
[root@6 ~]# uniq -c  a
     1 a:12
     1 b:23
     1 a:1
     1 b:34
     1 A:1
     1 a:1
     1 A:12

              -d:  仅显示连续重复过的行;

[root@6 ~]# uniq -d  a
a:1
[root@6 ~]# cat a
a:12
b:23
a:1
a:1
b:34
A:1
a:1
A:12

             -u:  仅显示不曾重复的行;

[root@6 ~]# uniq -u  a
a:12
b:23
b:34
A:1
a:1
A:12

            uniq和sort常配合使用

                   sort userlist.txt | uniq -c

[root@6 ~]# cat /etc/init.d/functions|tr -cs '[:alpha:]' '\n'|sort |uniq -c |sort -rn
    83 if
    77 then
    75 pid
    73 echo
    72 fi
    61 return
    57 dev
    54 file
####对/etc/init.d/functions中重复单词进行由大到小排序


   7、比较文件

         比较两个文件之间的区别

        $ diff foo.conf-broken foo.conf-works

        5c5

        < use_widgets= no

        

        > use_widgets = yes

           注明第5 行有区别(改变)

[root@6 ~]# cat a
a:12
b:23
a:1
a:1
b:34
A:1
a:1
A:12
[root@6 ~]# cat b
a:12
b:23
a:1
a:1
b:34
           [root@6 ~]# diff a b
6,8d5
< A:1
< a:1
< A:12

    

    复制对文件改变patch

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

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

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

              适用 -b 选项来自动备份改变了的文件

        $ diff -u foo.conf-broken foo.conf-works > foo.patch

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

[root@6 ~]# diff a b
6,8d5
< A:1
< a:1
< A:12
[root@6 ~]# diff -u a b > c    ###生成比较文件
[root@6 ~]#  patch -b  b c     ##通过b和比较文件还原文件a,新文件命名为b,备份源文件.orig
patching file b
Reversed (or previously applied) patch detected!  Assume -R? [n] y
[root@6 ~]# ll
-rw-r--r--. 1 root root    36 8月   6 13:18 b
-rw-r--r--. 1 root root    23 8月   6 12:56 b.orig  ##生成备份文件
[root@6 ~]# cat b.orig
a:12
b:23
a:1
a:1
b:34
[root@6 ~]# cat b ###恢复的a文件
a:12
b:23
a:1
a:1
b:34
A:1
a:1
A:12


二、文本处理工具

    Linux 上文本处理三剑客

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

             grep, egrep, fgrep (不支持正则表达式 搜索)

       sed :stream editor ,文本编辑工具;

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

  1、grep处理工具

        grep: Global search REgular expression and Print outthe line.

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

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

       grep [OPTIONS] PATTERN [FILE…]

        grep root /etc/passwd

        grep "$USER" /etc/passwd

        grep '$USER' /etc/passwd

        grep `whoami` /etc/passwd

[root@6 ~]# grep root /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
                [root@6 ~]# grep "$USER" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@6 ~]# grep '$USER' /etc/passwd
[root@6 ~]#                                                  ###无结果
[root@6 ~]# grep `whoami` /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

     grep 命令选项

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

     alias grep='grep --color=auto'

            -v:  显示不能够被pattern 匹配到的行;

[root@6 ~]# cat a.txt
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda2       50264772 4064872  43639900   9% /
tmpfs             502068      80    501988   1% /dev/shm
/dev/sda1         194241   34211    149790  19% /boot
/dev/sda3       20027260  333392  18669868   2% /testdir
/dev/sr0         3824484 3824484         0 100% /media/CentOS_6.8_Final
[root@6 ~]# grep -v  sd a.txt
Filesystem     1K-blocks    Used Available Use% Mounted on
tmpfs             502068      80    501988   1% /dev/shm
/dev/sr0         3824484 3824484         0 100% /media/CentOS_6.8_Final

          -i:  忽略字符大小写

          -n: 显示匹配的行号

[root@6 ~]# cat a
a:12
b:23
a:1
a:1
b:34
A:1
a:1
A:12
[root@6 ~]# grep -in a a
1:a:12
3:a:1
4:a:1
6:A:1
7:a:1
8:A:12

           -c:  统计匹配的行数    与其他选项,仅显示行数

[root@6 ~]# grep -inc a a
6

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

[root@6 ~]# grep -ino a a
1:a
3:a
4:a
6:A
7:a
8:A

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

[root@6 ~]# grep -inqo a a
[root@6 ~]# echo $?                                   ###显示结果结果状态码
0                                                     ###0表示有返回结果
[root@6 ~]# grep -inqo d a
[root@6 ~]# echo $?
1                                                     ###非0表示无返回结果

           -A #:after,  后#行

[root@6 ~]# grep -A1  root pass
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
--
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin

 

           -B #: before,  前#行

[root@6 ~]# grep -B1  root pass
root:x:0:0:root:/root:/bin/bash
--
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

 

           -C # :context,  前后各#行

[root@6 ~]# grep -C1  root pass
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
--
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin

 

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

               grep –e ‘cat ’ -e ‘dog’ file

[root@6 ~]#  grep -e lvasu -e root  /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
lvasu:x:500:500:lvasu,class1,911,****:/home/lvasu:/bin/bash

           -w :整行匹配整个单词

[root@6 ~]# grep  ro /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
rtkit:x:499:499:RealtimeKit:/proc:/sbin/nologin
[root@6 ~]# grep -w  ro /etc/passwd                         ###无匹配,与普通模式比较

           -E :使用扩展正则表达式


    正则表达式

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

         程序支持:grep, vim, less,nginx等

         分两类:

    基本正则表达式:BRE

    扩展正则表达式:ERE

                      grep -E, egrep

        正则表达式引擎:

    采用 不同 算法,检查处理正则表达式的软件模块

    PCRE(Perl Compatible Regular Expressions)

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


   基本正则表达式元字符

    字符匹配:

    .  :匹配任意单个字符;

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

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

           [:digit:] 、[:lower:] 、[:upper:] 、[:alpha:] 、[:alnum:]、[:punct:] 、[:space:]

        [[:alpha:]_}:表示从字母和下划线中取一个


字符匹配 . 任意单一字符
[  ] [ ]内任意单一字符
[^] 除[ ]内任意单一字符

   匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数

        * :匹配前面的字符任意次,包括0次

                 贪婪模式:尽可能长的匹配

        .* :任意长度的任意字符

        \? :匹配其前面的字符0或1次

        \+ :匹配其前面的字符至少1次

        \{m\} :匹配前面的字符m次

        \{m,n\} :匹配前面的字符至少m 次,至多n次

        \{,n\} :匹配前面的字符至多n次

        \{m,\} :匹配前面的字符至少m次

次数匹配 * 前面字符重复不确定次数
\+ 前面字符重复一次以上不确定次数
\? 前面字符重复0或1次
.* 任意长度字符
\{n\} 前面字符重复n次
\{n,\} 前面字符重复n次以上
\{m,n\} 前面字符重复m次和n次之间

   位置锚定:定位出现的位置

        ^ :行首锚定,用于模式的最左侧

        $ :行尾锚定,用于模式的最右侧

              ^PATTERN$:  用于模式匹配整行

        ^$:  空行

        ^[[:space:]]*$  :空白行

        \< 或 \b :词首锚定,用于单词模式的左侧

        \> 或 \b :词尾锚定;用于单词模式的右侧

        \<PATTERN\> :匹配整个单词


位置锚定 ^ 行首锚定
$ 行尾锚定
^PATTERN$: 用于模式匹配整行
^[[:space:]]*$ 空白行
\< 或 \b 词首锚定
\> 或 \b 词尾锚定

     分组:\(\):将一个或多个字符捆绑在一起,当作一个整体进行处理,如:\(root\)\+

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

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

        实例: \(string1\+\(string2\)*\)

        \1: string1\+\(string2\)*

        \2: string2

               后向引用:引用前面的分组括号中的模式所匹配字符(而 而非模式本身)

[root@6 ~]# grep  '^\(.*\).*/\1$' pass
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:4323:4324::/home/bash:/bin/bash
basher:x:4325:4326::/home/basher:/bin/bash


  2、egrep 及扩展的正则表达式       蓝字部分与标准正则表达式相异的地方

    egrep = grep -E

    egrep [OPTIONS] PATTERN [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

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