美文网首页
linux之正则、三剑客(grep、sed、awk)

linux之正则、三剑客(grep、sed、awk)

作者: 你好树洞先生 | 来源:发表于2019-12-18 15:40 被阅读0次

    关于正则表达式和三剑客:

    1、什么是正则表达式?

    作用和特殊字符一样。

    正则表达式是为处理大量的字符串及文字而定义的一套规则和方法。

    2、linux三剑客的正则表达式有如下几个特点:

    (1)为处理大量文本及字符串而定义的一套规则和方法。

    (2)其工作时以行为单位进行,即一次处理一行。

    (3)通过正则表达式可以将复杂的处理任务化繁为简。

    (4)仅被三剑客(grep、sed、awk)命令支持,其他命令无法使用。

    3、提高效率,快速获取到想要的内容。

    4、适用于三剑客命令grep、sed、awk以行为单位处理。

    (1)进行一下别名的配置:

    alias grep ='grep --color=auto'

    alias egrep='agrep --color=auto' #<==配置后会把匹配上的内容用红色显示

    (2)注意LC_ALL环境变量的设置,建议为:

      export LC_ALL=C        #<==配置后操作时不会出现异常匹配情况。

    完整的处理命令为:

    cat >>/etc/profile<<EOF          #<==注意EOF后面不要有多余的空格

    alias grep ='grep --color=auto'

    alias egrep='agrep --color=auto'

    export LC_ALL=C 

    EOF                              #<==注意EOF后面不要有多余的空格或者其他符号

    source /etc/profile              #<==使修改的内容生效。

    5、正则表达式的分类:

    linux三剑客的正则表达式可以分为两类:

    (1)基本正则表达式

    (2)扩展正则表达式

                   ^尖角号,以...开头.^linux 以linux开头

    -----------------------------------------------------------------

                   $美元符 以...结尾。linux$,以linux结尾

    -----------------------------------------------------------------

                    ^$ 空行

    ------------------------------------------------------------------

                   . 匹配任意一个且只有一个字符,和通配符? 一样

    -------------------------------------------------------------------

                    \ 让有意义的字符 脱掉马甲,还原本义

    -----------------------------------------------------------------

                    * 重复前面字符0次或多次

    -----------------------------------------------------------------

                   .*表示所有内容

    -----------------------------------------------------------------

                   ^.* 组合符 匹配以任意0个多个字符开头的内容

                    ifconfig eth0|sed -rn '2s#^.*addr(.*)Bc.*$#\1#gp'

    -----------------------------------------------------------------

                   .*$ 以任意0个或者多个字符结尾

    -----------------------------------------------------------------

                   [abc]匹配[]集合内的任意一个字符a或b或c;[abc]也可以写成[a-c]

    --------------------------------------------------------------------------

                   ^[abc]匹配不包含^后的任意字符a或b或c

    (3)扩展正则(ERE):

                +      匹配前一个字符1次或者多次

    -----------------------------------------------------------------

                [:/]+  匹配括号内的:或 /字符1次或1次以上

    -----------------------------------------------------------------

                ?      匹配前一个字符0次或者1次

    -----------------------------------------------------------------

                  |      或者 同时过滤多个字符串

    -----------------------------------------------------------------

                ()      分组过滤被括号起来的东西表示一个整体

    -----------------------------------------------------------------

                \n      引用前面()小括号里的内容,例如:(aa)\1,匹配aaa

    -----------------------------------------------------------------

                a{n,m}  匹配前一个字符最少n次,最多m次

    -----------------------------------------------------------------

                a{n,}  匹配前一个字符最少n次

    -----------------------------------------------------------------

                a{n}    匹配前一个字符正好n次

    -----------------------------------------------------------------

                a{,m}  匹配前一个字符最多m次

    -----------------------------------------------------------------

                es?    匹配e es

    -----------------------------------------------------------------

                es*    匹配e es ess esss es...

    (4)特殊中括号:

          [:dight:]  匹配任意一个数字字符,相当于[0-9]

          [:lower:]  匹配小写字母,相当于[a-z]

          [:upper:]  匹配大写字母,相当于[A-Z]

    (5)元字符

          \b 匹配单词边界  类似grep -w

          \d 匹配单个数字字符 需用grep -p

    例子:

    [root@test ~]# grep "^I" linux.txt

    I am student !

    I like linux

    my qq num is 999888666

    ==============================================================

    6、linux 三剑客

           awk     sed         grep

    sed:

    sed是操作、过滤和转换文本内容的强大工具。

    常用功能有对文件实现快速增删改查(增加、删除、修改、查询)。

    其中查询的功能中最常用的2大功能是过滤(过滤指定字符串)和取行(取出指定行).

    sed [选项] [sed内置命令字符] [文件]

    选项:

    -n  取消默认sed的输出,常与sed内置命令的p连用。

    -i  直接修改文件内容,而不是输出到终端

    如果不使用-i选项sed 只是修改在内存中的数据,并不会影响磁盘上的文件。

    sed 的内置命令字符说明:

    s 替换

    g 全局global

    p 打印print

    d 删除delete

    -----------------------------------------------------------------

    例子1: 输出linux.txt 的第2-3行内容

    [root@test ~]# head -3 linux.txt

    I am student !

    I like linux

    my qq num is 999888666

    -----------------------------------------------------------------

    例子2:过滤出含有linux字符串的行

    [root@test ~]# grep linux linux.txt

    I like linux

    -----------------------------------------------------------------

    例子3:将文中的linux字符串全部替换为SElinux

    vim 替换:

    :%s#linux#SElinux#g

    sed 's#想替换啥#用啥替换#g' linux.txt

    sed 's#linux#SElinux#g' linux.txt

    修改文件:

    sed 's#linux#SElinux#g' linux.txt

    ----------------------------------------------

    例子4:在linux.txt 文件的第2行插入文本

    考查的sed命令的i字符功能:

    [root@test ~]# sed -i '2i I learn linux,at 2i.' linux.txt

    [root@test ~]# cat -n linux.txt

    1  I am student !

    2  I learn linux,at 2i.

    3  I like linux 

    -----------------------------------------------------------------

    例子5:删除指定行

    sed -i  '3d' linux.txt

    sed -i  '5,8d' linux.txt

    -----------------------------------------------------------------

    例子6:取出linux中执行ifconfig eth0后对应的IP地址(只能输出IP地址).

    [root@test ~]# ifconfig eth0|sed -n 2p|grep "^.*inet"

      inet 10.0.0.201 network 255.255.255.0 broadcast 10.0.0.255

    [root@test ~]# ifconfig eth0|sed -n 2p|sed 's#^.*inet ##g'|sed 's# netm.*$##g'

    10.0.0.201

    7.cut 按列切割:

    -d 指定分隔符  -f 指定那列,多列用逗号

    [root@test ~]# cat a.txt

    1 2 3 4 5 6 7 8 9 10

    [root@test ~]# cut -d "" -f1,3,5 a.txt

    1 3 5

    [root@test ~]# cut -d "" -f3-5 a.txt

    3 4 5

          -d 指定分隔符

    cut  -f 指定那列,多列可用逗号或-

          -c 按字符取内容

    =======================================================

    8、 awk:linux三剑客老大

    三剑客自身有的特长。

    grep 过滤查找内容。筛子

    sed  取行,替换,删除,追加

    awk  去列

    -----------------------------------------------------------------

    awk [option] 'pattern{action}' file...

    awk [参数]  '条件{动作}'  文件...

    参数:

    -F 指定分隔符:

    打印第一列:

    [root@test ~]# awk -F ":" '{print $1}' linux.txt

    root

    bin

    daemon

    adm

    lp

    [root@test ~]# awk -F ":" '{print $3,$5}' linux.txt

    0 root

    1 bin

    2 daemon

    3 adm

    4 lp

    列:$1 第一列  $2 第二列  ...

    $0  整行

    $NF  最后一列

    -----------------------------------------------------------------

    例子:打印 1 2 和 最后一列

    [root@test ~]# awk -F ":" '{print $1,$2,$NF}' linux.txt

    针对该awk命令的常见变量进行了列表:

    变量名        属性

    $0        当前整行记录

    $n        当前记录的第n个列,字段间由FS或-F参数指定分隔符

    NF        当前记录中的列的个数,就是有多少列

    $(NF-n)    倒数第n列,n为数字

    NR        已经读出的记录数,就是行号,从1开始

    -----------------------------------------------------------------

    例子:取出ip地址:

    [root@test ~]# ifconfig eth0|awk 'NR==2{print $2}'

    10.0.0.201

    相关文章

      网友评论

          本文标题:linux之正则、三剑客(grep、sed、awk)

          本文链接:https://www.haomeiwen.com/subject/nvjunctx.html