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

2019-12-18  本文已影响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

上一篇下一篇

猜你喜欢

热点阅读