Linux 正则表达式

来源:互联网 发布:电子屏软件图标 编辑:程序博客网 时间:2024/06/07 22:32

正则表达式:处理字符串的方法,它是以行为单位来进行字符串的处理行为,通过一些辅助符号的辅助,可以轻易达到查找、删除、替换某待定字符串的处理程序。

基本正则表达式字符:

^word   : 待查找的字符串(word)在行首

word$   :   待查找的字符串(word)在行尾

.        : 代表一定有一个任意的字符

\        : 转义字符,将特殊符号的特殊意义去除

*       : 重复零个到无穷多个的前一个字符

[list]  : 从字符集合的RE字符里面找出想要选取的字符

[n1-n2] :

[^list] : 从字符集合里面找出不要的字符串或范围

\{n,m\} :

 

 

grep 工具:以行为单位的字符串选取操作

grep用于字符串数据的对比,分析一行信息,若当中有我们需要的信息,就将该行列出来。grep在数据中查找一个字符串时,是以整行为单位来进行数据选取的。

语法:grep [-acinv] [--color=auto] 'search string'filename

参数:

-a :

-c : 计算找到 'serch string' 的次数;

-i : 忽略大小写的不同,即大小写视为相同;

-n :输出行号;

-v : 反向选择,即显示出没有 'serch string' 内容的那一行;

--color=auto : 可以将找到的关键字部分加上颜色显示;

 

1.查找待定字符串:查找字符串'Give love',并显示行号,反向选择可以使用-vn

[root@hs-uf21 files]$ grep -n 'Give love'regular_expression.txt

7:Give love, for in giving it you will find the powerin life along with the joy, happiness, patience, and understanding.

 

2.查找集合字符:使用中括号[] 来查找

 

3.行首与行尾字符:^

查找行首是Look的行数据:

[root@hs-uf21 files]$ grep -n '^Look'regular_expression.txt

5:Look for the beauty around you--in nature, inothers, in yourself--and believe in the love of friends, family, and humankind.

查看空行信息:(^$)表示只有行首和行尾,也表示空白行

[root@hs-uf21 files]$ grep -n '^$'regular_expression.txt

10:空行

11:空行

 

sed 工具:以行单位进行数据的替换、删除、新增、选取操作

sed本身也是一个管道命令,可以分析standard input的,而且sed还可以将数据进行替换、删除、新增、选取选定行等功能。

语法:sed [-nefr] [function]

参数:

n:使用安静模式。在一般sed的用法中,所有来自STDIN的数据一般都会被列出到屏幕上,但如果加上-n 参数后,则只有经过sed特殊处理(或者操作)的那一行才会被列出来。

e:直接在命令行模式上进行sed的动作编辑;

f:直接将sed的动作写在一个文件内,-f filename 则可以执行filename的sed动作

r:

i:直接修改读取的文件内容,而不是由屏幕输出。

function: [n1[,n2]] [acdips]

n1,n2:一般表示选择进行动作的行数(不见得会存在);

a:新增,a的后面可以接字符串,而这些新的字符串会新的一行出现(目前行的下一行);

c:替换,c的后面可以接字符串,这些字符串可以替换n1,n2之间的行;

d:删除,因为是删除,所以d后面通常不接任何参数;

i:插入,i的后面可以接字符串,而这些新的字符串会新的一行出现(目前行的下一行);

p:打印,将某个选择的数据打印出来,通常p会与参数sed -n 一起运行;

s:替换,可以直接进行替换的工作。

注意:

    sed后面接的动作,一定要以''两个单引号括住。

    '1,$d'中的$表示最后一行。

 

 

新增:查看文件regular_expression.txt的内容中新增一行 # this istest ^_^!'

[root@hs-uf21 files]$ cat regular_expression.txt |sed'1a # this is test ^_^!'

# Never Give Up Hope !

# this is test ^_^!

 

选择:显示regular_expression.txt文件中第2-4行显示,sed后面必需加-n 否则整个文件的内容会全部显示出来

[root@hs-uf21 files]$ cat regular_expression.txt | sed-n '2,4p'

Life doesn't always give us the joys we want.

We don't always get our hopes and dreams, and we don'talways get our own way.

But don't give up hope, because you can make adifference one situation and one person at a time.

 

插入:在文件regular_expression.txt的第一行插入字符串“# Never Give Up Hope !”

[root@hs-uf21 files]$ sed -i '1i # Never Give Up Hope!' regular_expression.txt

[root@hs-uf21 files]$ vi regular_expression.txt

# Never Give Up Hope !

Life doesn't always give us the joys we want.

 

删除:regular_expression.txt文件中的内容:

[root@hs-uf21 files]$ sed -i '1,$d'regular_expression.txt

说明:-i表示修改regular_expression.txt 文件中的内容,'1,$d'中表示第1行,$表示文件最后一行,d表示删除功能

 

扩展正则表达式:egrep或者grep-E

1.  +  :重复一个或者一个以上的前一个RE字符

如:找出一含有一个及以上'f'的行信息

[root@hs-uf21 files]$ egrep 'f+'regular_expression.txt

But don't give up hope, because you can make adifference one situation and one person at a time.

2.  ?  : 零个或者一个的前一个RE字符

如:找出一含有一个及以上'f'的行信息,因为?表示零个或者一个,所能必需使用'ff?'

[root@hs-uf21 files]$ egrep 'ff?'regular_expression.txt

But don't give up hope, because you can make adifference one situation and one person at a time.

3.  |  : 用或(or)的方式找出数个字符串

如:找出以#为行首(^#)和空行(^$)的信息,并输出行号

[root@hs-uf21 files]$ egrep -n '^#|^$' regular_expression.txt

1:# Never Give Up Hope !

10:

 

4.  () :找出组字符串

如:找出含有字符串‘give’的行信息,不区分大小写

[root@hs-uf21 files]$ egrep -ni'(give)' regular_expression.txt

1:# Never Give Up Hope !

2:Life doesn't always give us the joys we want.

 

 

5. ()+ : 找出多个重复组

 

 

awk 工具:以行为单位的字段处理操作,

awk可以将行分成数个“字段”来处理,默认的字段的分隔符为空格或者[tab]键,比较适合处理小型的数据。

awk后面接两个 单引号并加上大括号{}来设置想要对数据进行的处理动作,awk可以处理后续接的文件,也可以读取来自前个命令的standardoutput。

awk处理的数据中,每一行的每个字段都是有变量名称的,那就是$1、$2... $n等变量名称,1、2 ... n 表示列名,$0 表示 一整行数据的意思

 

语法:awk '条件类型1 {动作1} 条件类型2 {动作2} ....' filename

awk的内置变量:

1. NF : 每一行($0)拥有的字段总数

2. NR : 目前awk所处理的是“第几行”数据

3. FS : 目前的分隔字符,默认是空格键

 

 

如:输出/etc/passwd文件中前三行的第1列和第7列,FS=":"用来设置分隔符

[root@hs-uf21 files]$ sed -n '1,3p' /etc/passwd | awk'{FS=":"} { print $1 "" $7}'

root:x:0:0:root:/root:/bin/bash

bin/sbin/nologin

daemon/sbin/nologin

注意:上面第一行并没有安要求输出,需要使用 BEGIN关键字进行处理,如

[root@hs-uf21 files]$ sed -n '1,3p' /etc/passwd | awk 'BEGIN {FS=":"} { print $1 ""$7}'

root/bin/bash

bin/sbin/nologin

daemon/sbin/nologin

 

如:输出/etc/passwd文件中第2-3行的第1列和第7列,并输出行号

[root@hs-uf21 files]$ awk 'BEGIN {FS=":"} NR >1&& NR <=3 {print NR"-"  $1 ":" $7}'/etc/passwd

2-bin:/sbin/nologin

3-daemon:/sbin/nologin