`
tiankefeng0520
  • 浏览: 147239 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

Linux学习记录--正则表达式与其应用

阅读更多

正则表达式与其应用

 

数据处理工具:awk ,sed

 

正则表达式基本上是一种“表示法”,只要工具程序支持这种表示法,那么该工具程序就可以用来作为正则表达式的字符串处理只用。例如vi,grep,awk,sed等工具

 

正则表达式特殊符号

 

语系对应正在表达式也会存在影响。比如

LANG=C时:0 1 2 3 4 … A B C D ..Z a b c d ..z

LANG=ZH_CN时:0 1 2 3 4 …a A b B c C d D …….

 

因此[a-z]C语系时代表的意义是获取小写字母。在ZH_CN语系时代表的意义就是获取字母(大写与小写)

为了避免数字和字母的选取错误,正则表达式采用特殊符号来代表

[:alnum:]:代表英文大小写字符及数字。A-Z a-z 0-9

[:alpha:]:代表英文大小写字符 A-Z a-z

[:blank:]:代表空格与TAB

[:cntrl:]:代表键盘上的控制按键 CR,LF,TAB,DEL

[:digit:]:代表数据 0-9

[:graph:]:代表除了空格与TAB键的其他所有按键

[:lower:]:代表小写字符

[:upper:]:代表大写字符

[:print:]:代表任何可以被打印出来了的字符

[:punct:]:代表标点符号字符

[:space:]:代表会产生的空白的字符如TAB空格 CR

[:xdigit:]:代表十六进制的数字类型 0-9 A-F a-f

 

举例

[root@localhost ~]# cat xargsfile |grep -n '[[:upper:]]'

2:FRA

4:AWEE

 

基础正则表达式字符

字符

意义与范例

^word

意义:查找以word为行首的数据

 

举例:查找以#开始的那一行

gerp ‘^#’ file.txt

Word$

意义:查找以word为行尾的数据

 

举例:查找以#为结尾的那一行

grep‘#$’ file.txt

.

意义:代表一定有一个任意字符

 

举例查找字符串eae,ebe e eee之间一定有一个字符,空格也算字符

G

 

rep ‘e.e’ file.txt

*

意义:重复0个到无穷个前一个字符

 

举例:查找含有es ess esss等的字符串

grep ‘ess*’ file.txt

[]

意义:从字符集合中找出想要选取的字符

 

举例:查找含有glgd的那一行

grep ‘g[ld]’ file.txt

[n1-n2]

意义:从字符集合里找出想要选取的字符范围

 

举例:查找含有任意数字的哪一行

grep ‘[0-9]’ file.txt

[^]

意义:从字符集合中找处不要的字符或范围

 

举例:查找不含大写字母的那一行

grep ‘[^A-Z]’ file.txt

\{n,m\}

意义:连续n个到m个的前一个字符,如\{n\}则是连续n个前一个字符,如\{n,\}则是连续n个以上前一个字符

 

举例1:查找gg之间包含2个到3o的字符串如:goog gooog

grep ‘\{2,\3}’ file.txt

举例2:查找gg之间包含2o的字符串如:goog

grep ‘\{2\}’ file.txt

举例3:查找gg之间包含3个及以上o的字符串如:gooog,gooood,goo….od

grep ‘\{3,\}’ file.txt

 

 

扩展正则表达式

字符

意义与范例

+

意义:重复一个或一个以上的字符

 

举例:查找god,good,good等字符串

egrep ‘go+d’ file.txt

?

意义:0个过1个前一个字符

 

举例:查找gd god

egrep ‘go?d’ file.txt

|

意义:用或的方式找出数个字符串

 

举例:找出my ,own

egrep ‘my|own’ file.txt

()

意义:找出“组“的字符串

 

举例:找出good glad

egrep ‘g(oo|la)d’ file.txt

()+

意义:多个重复组的判别

 

举例:找出Axy123123123C

egrep ‘Axy(123)+C’ file.txt

 

说明:如grep需要使用扩展正则表达式,可使用grep –eegrep

sed

 

sed本身是一个也是一个管道命令。可以分析输入数据流,还可以将数据进行替换,删除,选去等操作

 

sedtr的区别

tr操作的单元是字符,它针对字符进行删除和替换

sed操作单元的是行,它针对行进行删除和替换

 

sedvim的区别

sed是管道命令它修改只是输入数据流,并不会修改文件本身。虽然sed也可以直接修改文件,但是不需要打开文件,对于大文件来说很有帮助

vim是文本编辑器,它修改的是文件本身

 

语法sed [-nefr] ‘动作

选项与参数:

-n:silent模式,只将sed处理过的内容显示i出来

-e:设置多个sed动作

-f filename: 文件内记录sed脚本scipt

-r:sed支持的扩展正则表达式语法(默认是基础正则表达式)

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

 

动作:n1,n2function

n1,n2不一定存在

 

function:

a:新增,a后面接字符串,这些字符在当前的下一行显示

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

d:删除,删除n1-n2之间的行

i:添加,i后面接字符串,这些字符在当前的上一行显示

p: 打印,打印n1~n2行之间的数据

s: 替换以关键字形式替换,并不是替换整行. sed ‘s/旧字符串/新字符串/g’’

 

 举例:

[root@localhost ~]# cat sedfile |sed -n 'p' =>查询所有内容
line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
line 9
line 10
[root@localhost ~]# cat sedfile |sed -n '1,4p'=>查询1~4内容
line 1
line 2
line 3
line 4
[root@localhost ~]# cat sedfile |sed '2a new line'|sed -n '1,5p'
=>在第2行下添加新的一行
line 1
line 2
new line
line 3
line 4
[root@localhost ~]# cat sedfile |sed '3d'|sed -n '1,4p'
=>删除第3行
line 1
line 2
line 4
line 5
[root@localhost ~]# cat sedfile |sed '2i insert line'|sed -n '1,5p'
=>在第2行上添加新的一行
line 1
insert line
line 2
line 3
line 4
[root@localhost ~]# cat sedfile |sed '2,3c replace line'|sed -n '1,3p'
=>替换2~3行
line 1
replace line
line 4
[root@localhost ~]# cat sedfile |sed '1,3s/ne/NEL/g'|sed -n '1,6p'
=>用NEL替换2~3行的ne
liNEL 1
liNEL 2
liNEL 3
line 4
line 5
line 6

举例2:使用sed直接修改文件

[root@localhost ~]# sed -i '$a this is line' sedfile ;cat sedfile|tail -n 2 
line 10
this is line

awk

 

(awk功能很强大,这里只是功能介绍性说明)

Awk 是一个数据处理工具,相比sed作用于一整行的处理,awk则将一行分为数个“字段”处理

 

awk的处理流程

1.       读入第一行,并将第一行的数据填入$0,$1,$2……等变量中

2.       依据条件类型的限制,判断是否需要后面的动作

3.       做完所有的动作与条件类型

4.       若还有后续的行的数据,则重复1-3步骤

 

语法:awk ‘条件类型1 {动作1}条件类型2 {动作2}……’ filename

说明:

1.         awk默认用空格或tab来分割一行数据,并将数据填充到$1,$2..

如:root  pts1  192这一行, $1=root  $2=pts1.

2.         awk后方语句中非变量需使用双引号来定义,变量可以直接使用

awk内置变量

 

变量

描述

$n

当前记录的第n个字段,字段间由FS分隔。

$0

完整的输入记录。

ARGC

命令行参数的数目。

ARGIND

命令行中当前文件的位置(从0开始算)。

ARGV

包含命令行参数的数组。

CONVFMT

数字转换格式(默认值为%.6g)

ENVIRON

环境变量关联数组。

ERRNO

最后一个系统错误的描述。

FIELDWIDTHS

字段宽度列表(用空格键分隔)。

FILENAME

当前文件名。

FNR

同NR,但相对于当前文件。

FS

字段分隔符(默认是任何空格)。

IGNORECASE

如果为真,则进行忽略大小写的匹配。

NF

当前记录中的字段数。

NR

当前记录数。

OFMT

数字的输出格式(默认值是%.6g)。

OFS

输出字段分隔符(默认值是一个空格)。

ORS

输出记录分隔符(默认值是一个换行符)。

RLENGTH

由match函数所匹配的字符串的长度。

RS

记录分隔符(默认是一个换行符)。

RSTART

由match函数所匹配的字符串的第一个位置。

SUBSEP

数组下标分隔符(默认值是\034)。

 

awk运算符

 

运算符

描述

= += -= *= /= %= ^= **=

赋值

?:

C条件表达式

||

逻辑或

&&

逻辑与

~ ~!

匹配正则表达式和不匹配正则表达式

< <= > >= != ==

关系运算符

空格

连接

+ -

加,减

* / &

乘,除与求余

+ - !

一元加,减和逻辑非

^ ***

求幂

++ --

增加或减少,作为前缀或后缀

$

字段引用

in

数组成员

举例1:查看$1 NR NF

[root@bogon ~]# last -n 5 | awk '{print $1 "\t lines: " NR "\t cols: "NF }'
root     lines: 1        cols: 10
root     lines: 2        cols: 9
root     lines: 3        cols: 9
reboot   lines: 4        cols: 9
root     lines: 5        cols: 10

举例2:带有条件的,仅输出$1==root的数据

[root@bogon ~]# last -n 5 | awk '$1=="root" {print $1 "\t lines: " NR "\t cols: "NF }'
root     lines: 1        cols: 10
root     lines: 2        cols: 9
root     lines: 3        cols: 9
root     lines: 5        cols: 10

awk关键字

 

BEGIN

 

BEGIN关键字作用是预设,在读如第一行前面就执行BEGIN后面的动作

比如每一行默认分割方式是空格或是TAB,所以我们可以设置FS来改变分割符,但是此时第一行数据已经读取分析完毕,列信息已经存在$1$2..中,改变只能从第2行开始。

举例:

[root@bogon ~]# cat /etc/passwd|head -n 5 |awk 'BEGIN {FS=":"} NR=="1" {print"UID\tGID"} NR>="1" {print $1 "\t" $3}'
UID     GID
root    0
bin     1
daemon  2
adm     3
lp      4

举例2 计算数据(num1+num2)

数据文件
month:num1:num2
1:100:150
2:200:250
3:300:350
4:400:450
5:500:550
6:600:650

[root@bogon ~]# cat cal.file |awk 'BEGIN {FS=":"} NR=="1" {print$1"\t"$2"\t"$3"\ttotal"} NR>"1" {print$1"\t"$2"\t"$3"\t"$2+$3}'

month   num1    num2    total
1       100     150     250
2       200     250     450
3       300     350     650
4       400     450     850
5       500     550     1050
6       600     650     1250

END

 

END操作将在扫描完全部的输入之后执行

 

举例:

[root@bogon ~]# cat cal.file |awk 'BEGIN {FS=":"} NR=="1" {print$1"\t"$2"\t"$3"\ttotal"} NR>"1" {print$1"\t"$2"\t"$3"\t"$2+$3} END {print "sum"}'
month   num1    num2    total
1       100     150     250
2       200     250     450
3       300     350     650
4       400     450     850
5       500     550     1050
6       600     650     1250
sum

 

0
0
分享到:
评论

相关推荐

    greta-2.6.4-vc6正则表达式

    正则表达式(Regular Expression)是一种强大的文本处理工具,广泛应用于编程语言、文本编辑器和各种软件中,用于搜索、匹配、替换和提取文本模式。在本文中,我们将深入探讨greta-2.6.4-vc6版本中的正则表达式实现...

    手机号-邮箱-用户名-正则表达式

    手机号-邮箱-用户名-正则表达式

    常用正则表达式-常用正则表达式-常用正则表达式

    常用正则表达式-常用正则表达式-常用正则表达式 常用正则表达式-常用正则表达式-常用正则表达式

    BGP_AS-PATH的正则表达式

    ### BGP_AS-PATH的正则表达式:深入解析与应用 #### 一、BGP_AS-PATH与正则表达式的基本概念 BGP (Border Gateway Protocol) 是互联网上使用最广泛的路由协议之一,用于在不同的自治系统(AS)之间交换路由信息。AS-...

    EXCEL-VBA-正则表达式-从实例开始.docx

    正则表达式(Regular Expression),简称“regex”或“regexp”,是一种强大的文本模式匹配工具,广泛应用于多种编程语言中,用于进行复杂的文本搜索和处理任务。尽管正则表达式的概念并非VBA所独有,但在Excel VBA...

    正则表达式大全 - 收集的最常用正则表达式

    正则表达式是一种强大的文本处理工具,用于匹配、查找、替换和分析字符串。它通过预定义的模式来识别和操作字符串中的数据。以下是一些常见的正则表达式及其用途: 1. 匹配中文字符:`[u4e00-u9fa5]` - 这个正则...

    matlab开发-交互式正则表达式工具

    学习和掌握正则表达式能够极大地提升MATLAB中处理文本数据的效率。交互式工具如`iregexp.m`则为开发者提供了便利,使正则表达式的试验和优化过程更加直观和高效。通过不断地实践和使用,你可以更好地理解和运用这些...

    java/Android 正则表达式详解

    Java 正则表达式详解是一份详细的正则表达式使用指南,它涵盖了正则表达式的基础知识、语法、实践应用等方面的内容。本文首先简要地介绍了正则表达式的基础知识,然后以 Jakarta-ORO API 为例,详细地介绍了如何使用...

    Linux常用命令和管理03-grep及正则表达式1

    本文将详细介绍 Linux 中的 grep 命令和正则表达式的使用,涵盖变量类别、Bash 配置文件、计算机理解、编程语言、Bash 编程、文件搜索、grep 命令、正则表达式、基本正则表达式的元字符、次数匹配、位置锚定、分组、...

    Python-24-正则表达式.md

    Python-24-正则表达式.md

    正则表达式列举 代码 项目中直接使用

    正则表达式是一种强大的文本处理工具,用于模式匹配、搜索、替换等操作,在软件开发、数据处理、网络爬虫等领域有着广泛的应用。在项目中直接使用正则表达式可以极大地提高代码的效率和可读性。以下是对给定文件中的...

    regex---正则表达式教程.docx

    正则表达式(Regex)是一种强大的...通过深入学习正则表达式,我们可以更有效地处理文本数据,进行复杂的查找、替换和验证操作。无论是在日常文本编辑,还是在编程语言中,掌握正则表达式都将极大地提升我们的工作效率。

    re --- 正则表达式操作 — Python 3.10.0a4 文档.pdf

    Python 正则表达式操作 正则表达式是 Python 中的一种强大的文本匹配工具,提供了与 Perl 语言类似的匹配操作。该模块提供了 Unicode 字符串和 8 位字节串两种类型的匹配操作,但它们不能混用。在使用正则表达式时...

    Lucene 使用正则表达式

    2. **正则表达式(regex)在Lucene中的应用** 3. **regexQuery详解** 4. **示例代码解析** 5. **索引创建与查询流程** 6. **正则表达式的语法** #### Lucene简介 Lucene是一个高性能、全功能的全文搜索引擎库。它为...

    the-book-of-ruby-正则表达式

    The Book Of Ruby Ruby 正则表达式 正则表达式 正则表达式 正则表达式 正则表达式

    【cad开发】在lisp中应用正则表达式

    "cad开发-在lisp中应用正则表达式" 本文介绍了在CAD二次开发软件LISP中应用正则表达式的方法,旨在解决LISP编程中文本编辑的难点。作者介绍了正则表达式的强大功能,并提供了两个函数:(xxexp)和(xxexpr),这些函数...

    正则表达式大全.docx

    正则表达式是一种强大的文本处理工具,用于在字符串中进行模式匹配和搜索替换操作。它由特殊字符(称为“元字符”)和...正则表达式的学习和掌握需要时间和实践,但一旦熟悉,它们将成为你处理字符串问题的强大武器。

    xJavaFxTool-spring-正则表达式

    JavaFxSpringBootCronHostsCmdPdfEmail******Zookeeper 正则表达式 正则表达式 正则表达式 正则表达式 正则表达式

    06-正则表达式(python和linux高级编程阶段 代码和截图)

    06-正则表达式(python和linux高级编程阶段 代码和截图)06-正则表达式(python和linux高级编程阶段 代码和截图)06-正则表达式(python和linux高级编程阶段 代码和截图)06-正则表达式(python和linux高级编程阶段 ...

    正则表达式学习资料以及练习项目代码很多

    正则表达式(Regular Expression,简称regex)是用于匹配字符串的一种模式,广泛应用于文本处理、数据验证、搜索和替换等场景。在Python编程语言中,正则表达式提供了强大的文本处理能力,使得开发者能够高效地处理...

Global site tag (gtag.js) - Google Analytics