Linux正则表达式

grep搜寻字符串的五种情况

  1. 搜索特定字符串
  2. 使用[]搜索字符.^在字符集合符号([])代表反向选择,在[]之外代表定位在行首
  3. 行首与行尾字符^$
  4. 任意一个字符.(有且仅有一个,使用时需用转义字符\将.转变成普通字符)与重复字符*(0个或多个)
  5. 限定连续重复字符范围{}

字符集合使用的几种情况

????1)[range]????仅代表一个待搜索的字符

????2)[^range]????反向选择,与[range]相反

????3)\{n\}????重复前一个相同字符n个

????4)\{n,m\}????重复前一个相同字符n-m个

????5)\{n, \}????重复前一个相同字符n个以上

?

在万用字符当中,*代表0到无限多个字符的意思。在正则表达式中,*表示重复前一个字符0到无限多个的意思

?

printf ‘打印格式‘ 实际内容

????参数\a????????警告声音输出

????参数\b????????退格键(backspace)

????参数\f????????清除屏幕

????参数\n????????输出新的一行

????参数\r????????Enter键

????参数\t????????水平的tab按键

????参数\v????????垂直的tab按键

????参数\xNN????NN为两位数,可以转换数字成为字符

?

?????上一个执行命令所回传的值

$????表示当前shell的进程号

?

sed工具

sed是一个非交互式文本流编辑器,必须通过行号或正则表达式指定要改变的行。

sed读取数据流程:sed从文件的一个文本行或从标准输入读取数据,将读取的数据拷贝到一个编辑缓冲区,然后读命令行或脚本的第一条命令,并使用这些查找模式或定位行号来编辑它。重复此过程直到命令结束。

调用sed的方式:

  1. 在命令行键入命令????sed [选项] sed命令 输入文件
  2. 将sed命令插入脚本文件,然后调用sed????????sed [选项] –f sed脚本文件 输入文件
  3. 将sed命令插入脚本文件,并使sed脚本执行????????sed脚本文件 [选项] 输入文件

sed [-nef] [动作]

????参数-n????????所有来自STDIN的数据都不打印。只有经过sed特殊处理的那一行才会显示出来

????参数-e????????直接在指令行模式上进行sed的动作编辑

????参数-f????????直接将sed的动作写在一个档案内,-f filename则可以执行filename内的sed动作

????动作说明????[n1,[n2]]function

????????n1,n2不一定存在,一般代表选择进行动作的行数。

?

function有如下这些:

????a????新增。a的后面可以接字符串(在添加行的下一行出现)

????i????插入。i的后面可以接字符串(在添加行的上一行出现)

????c????取代。c的后面可以接字符串(可以取代n1,n2之间的行)

????d????删除。d的后面通常不接内容????

????p????打印。P常与n一起使用

????s????取代。可以直接进行取代工作。通常搭配正则表达式。

?

使用sed在文件中定位文本的方式

X

x为一行号

x,y

行号范围从x到y

/pattern/

查询包含模式的行

/pattern/pattern/

查询包含两个模式的行

/pattern/,x或x,/pattern/

通过行号和模式查询匹配字

x,y!

查询不包含指定行号x和y的行

?

sed编辑命令

p

打印匹配行

q

第一个模式匹配完成后退出或立即退出

=

显示文件行号

l

显示与八进制ASCII代码等价的控制字符

a\

在定位行号后附加新文本信息

{}

在定位行执行的命令组

i\

在定位行号后插入新文本信息

n

从另一个文件中读文本下一行,并附加在下一行

d

删除定位行

g

将匹配的那一行用空行代替

c\

用新闻本替换定位文本

y

传送字符

s

使用替换模式替换相应模式

n

延续到下一输入行,允许跨行的模式匹配语句

r

从另一个文件中读文本

G

添加一个空行

w

写文本到一个文件

??

?

如果需要对同一文件或同一行进行多次修改有以下方法:

????1)使用-e参数????cat file | sed ‘s/old1/new1/‘ –e ‘s/old2/new2‘

????2)使用分号;????????cat file | sed ‘s/old1/new1/;s/old2/new2‘

????3)多行????????cat file | sed ‘

????????????????s/old1/new1

????????????????s/old2/new2‘

?

创建sed脚本????????vi allsed.sed

?

AWK介绍

调用awk的三种方法

????1)命令行方式????awk [-F field-separator] ‘‘ input-file

????2)将awk写入脚本,并以awk命令解释器(#!/bin/awk -f)作为脚本的首行,设置脚本有可执行权限,通过键入脚本名称来调用它

????3)将awk命令插入一个单独文件然后执行

注:如果设置了-F参数,则awk每次读一条记录或一行,并使用指定的分隔符分割指定域。但如果未设置-F选项,awk假定空格为域分隔符,并保持这个设置直到发现一新行。当新行出现时,awk命令获悉已读完整条记录,然后再下一个记录启动读命令,这个读进程将持续到文件尾或文件不再存在。

注:awk语句都由模式和动作组成。省略模式部分,动作将时刻保持执行状态。模式可以是任何条件语句或复合语句或正则表达式。模式包括两个特殊字段BEGINENDBEGIN语句使用在任何文本浏览动作之前,之后文本浏览动作依据输入文件开始执行。END语句用来在awk完成文本浏览动作后打印相关信息。实际动作在大括号{}内指明。

awk ‘BEGIN{print "this is the start…"} {print $1,$2,$3,…} END{print "this is the end"}‘ filename

?

域和记录????域标记为$1,$2…$n。$0为行信息

元字符????????\ ^ $ . [ ] | * + ?

+ ?????????只适用于awk而不适用于grep或sed。+匹配一个或多个字符。?匹配0个或1个字符

~????????匹配正则表达式。!~是不匹配正则表达式

=????????等于。!=不等于。

++ --????????前缀和后缀

?

awk内置变量

ARGC????????命令行参数个数

ARGV????????命令行参数排列

ENVIRON????支持队列中系统环境变量的使用

FILENAME????awk浏览的文件名

FNS????????浏览文件的记录数

FS????????设置输入域分隔符,等价于命令行-F选项

NF????????浏览记录的域个数

NR????????已读的记录数

OFS????????输出域分隔符

ORS????????输出记录分隔符

RS????????控制记录分隔符

?

awk内置的字符串函数

gsub(r,s)????在整个$0中用s替代r

gsub(r,s,t)????在整个t中用s替代r

index(s,t)????返回s中字符串t的第一位置

length(s)????返回s的长度

match(s,r)????测试s是否包含匹配r的字符串

split(s,a,fs)????在fs上将s分成序列a

sub(r,s)????????用$0中最左边最长的子串代替s

substr(s,p)????返回字符串s中从p开始的后缀部分

substr(s,p,n)????返回字符串s中从p开始长度为n的后缀部分

sprint(fmt,exp)????返回经fmt格式化后exp

?

字符串屏蔽序列

\b退格键????\t tab键????\f走纸换页

\ddd八进制值????????????\n新行

\c任意其他特殊字符????????\r回车键

?

printf修饰符和格式

修饰符

????-左对齐

????Width域的步长

????.prec最大字符串长度,或小数点右边的位数

格式

????%c????ASCII字符

????%d或i????整数

????%e或E????浮点数,科学计数法

????%f????浮点数,带小数点

????%g????awk决定使用哪种浮点数转换e或f

????%o????八进制数

????%s????字符串

????%x????十六进制数

?

awk内置数值函数

????int(x)

????sqrt(x)

????exp(x)

????sin(x)

????rand()????????得到一个随机数(介于0到1之间)

?

diff [-bBi] from-file to-file

????参数-a????????将所有文件当作文本文件来处理

????参数-b????????忽略空格造成的不同

????参数-B????????忽略空行造成的不同

????参数-c????????使用纲要输出格式

????参数-i????????忽略大小写的变化

?

cmp [] file1 file2????diff主要以"行"为单位比对,cmp以"位"为单位去比对

????参数-s????????print nothing for differing files;return exit status only

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。