Linux进阶之正则,egrep,awk,sed命令

一、正则表达式:Regular Expression

正则表达式:正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些符合某个模式的文本。

作用:用一些特殊的字符来描述一个模式

正则是用于对文件中的内容进行过滤和匹配

通配符用于对文件名进行匹配

注意:在匹配模式中一定要加上引号

二、符号:

^           以开头

$           以结尾

^12$     1开头以2结尾

^$         空行

.     表示任意的一位字符(数字、字母、符号)

+    表示其前面的字符至少重复一次,可以是无数次

?    表示其前面的字符出现最多一次的情况,可以是0

*    重复任意次数(包括0次)

.*   表示任意长度的任意字符

{} 

{数字} 重复数字次,准确的重复多少次

{数字1,数字2}    至少重复数字1次,最多重复数字2

{数字,}           至少重复数字次,最多不限

{,数字}           最多重复数字次,最少不限

[]    表示范围,多个范围使用 , 分隔

[^字符]        表示匹配[^字符]之外的任意一个字符

^[^]       匹配不是中括号内任意一个字符开头的行

[0-9]            表示1位数字(0-9任意数字)

[a-z]             表示1位小写字母

[A-Z]    表示1位大写字母

[0-9,a-z,A-Z]

()           表示内部是一个整体

|            表示或者

三、常用的正则表达式

1、车牌号码

^[A-Z][0-9,A-Z]{5}$

2、手机号码

^1[0-9]{10}$

3、身份证号

^[0-9]{17}[0-9,X]$

4IP0-255.0-255.0-255.0-255

0-9 [0-9]

10-99    [1-9][0-9]

100-199       1[0-9][0-9]

200-249       2[0-4][0-9]

250-255       25[0-5]

方法一:^([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$

方法二:^([0-9]\.|[1-9][0-9]\.|1[0-9][0-9]\.|2[0-4][0-9]\.|25[0-5]\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$

5、密码(8位以上,包含数字、大小写字母)

egrep [a-z] passwd | egrep [A-Z] | egrep [0-9] | egrep ^.{8,}$

四、grep

作用:用于对文件中的内容进行过滤

原理:逐行对文件中的内容根据样式进行匹配,如果匹配成功就过滤出该行

格式:grep [options] PATTERN file

PATTERN:要匹配的模式

参数:

-e   =正则 用正则表达式来进行匹配操作,egrep=grep -egrep调用正则表达式

-f =文件 从文件中取得条件

-i    忽略文件中内容的大小写

-n   打印包含匹配项的行和行标

-o   只输出匹配的选项(不显示整行)

-w  完全匹配字词(精确匹配)

-x   仅完全匹配一行

-c 抑制正常输出;而是为每个输入文件打印匹配线的计数。

-v   取反

-V  显示版本信息

--color   将匹配到的内容进行着色

--help 显示帮助

-B NUM      显示匹配到的条件的之前 数字

-A NUM      显示匹配到的条件的之后 数字

-C NUM      显示匹配到的条件的为中心上下 数字

-NUM 等于-C

例子:

1、显示出test中不包含字母c的行

[root@ren4 ~]# grep -v "c" test

2、统计test中包含字母a的行的数量

[root@ren4 ~]# grep "a" test | wc -l

3、过滤出包含大写字母的行

[root@ren4 ~]# grep '[A-Z]' test

4、匹配非数字字符

[root@ren4 ~]# grep '[^0-9]' test

5、查看包含字母a的行,要求显示该行上下各2

[root@ren4 ~]# grep --color -C 2 'a' test

6、过滤出一行中a在前,v在后的行

[root@ren4 ~]# grep --color 'a.*v' test

7、匹配ab之间有最少2c最多5c的行

      [root@ren4 ~]# grep "ac\{2,5\}b" test

accccb

[root@ren4 ~]# egrep "ac{2,5}b" test

accccb

8过滤出以#为开头,且第二个字符是空格的行

[root@ren4 ~]# grep "^#[[:space:]]" test

[root@ren4 ~]# grep "^#[:space:]" test

grep: 字符类的语法是 [[:space:]],而非 [:space:]

9过滤出行首和行尾字母相同的行

[root@ren4 ~]# grep "^\([a-z]\).*\1$" test

adfdfa

[root@ren4 ~]# egrep "^([a-z]).*\1$" test

adfdfa

10、过滤出第一个字符是#,且第二个字符串是非空字符,而且结尾是数字的行

      [root@ren4 ~]# grep --color "^#[^[:space:]].*[0-9]$" test

正则练习

使用文件 /etc/init.d/functions ,下面可能有些部分题目匹配不到符合的情况。

1. 过滤出包含大写字母的行

[root@ren4 ~]# egrep "[A-Z]" /etc/init.d/functions

2. 匹配非数字字符

[root@ren4 ~]# egrep "[^0-9]" /etc/init.d/functions

3. 过滤出一行中a在前,b在后的行

[root@ren4 ~]# egrep "a.*b" /etc/init.d/functions

4. 匹配ab之间有最少2c最多5c的行

[root@ren4 ~]# egrep "ac{2,5]b" /etc/init.d/functions

5. 过滤出一行包含相同数字的行/etc/init.d/functions

[root@ren4 ~]# egrep ".*([0-9]).*\1" /etc/init.d/functions

五、awk

功能:通过正则表达式,得到需要的行,列信息

语法:

 

awk -F分隔符号 '{print $列数}' #-F可以不写,默认使用空格分隔

awk -F分隔符 '{print $列数}' 文件名 #可以直接过滤文件,但不会对源文件内容进行更改

#列说明 $0所有列 $数字 第数字列

示例:

1. awk 打印所有包含有 root 字段的行

awk '/root/' passwd

2.查看 df -h 命令的第 2

#df -h | awk '{print $2}'

3. 查看 df -h 命令的第 2,5

df -h | awk '{print $2,$5}'

4.显示 passwd 的第四行

awk 'NR==4' passwd

5.打印 ls l / 中包含 etc字段行的第二区域

ls -l / | awk '/etc/ {print $2}'

6.列示月份及年份 (\n 为换行符 )

date | awk '{print "Year:" $1 "\nMonth:" $2}'

7.在有 root 关键字的行的第 1 列后面增加 1 \t制表符 , 并增

RedHat, 2 列后面加 ! 字符

24-awk

RedHat, 2 列后面加 ! 字符

awk '/root/ {print $1 "\tRedHat Linux" $2 "!"}' passwd

8.在有 root字段的行前增加记录号 ($0 为行头前 )

awk '/root/{print NR,$0}' passwd

9.以:分割,匹配第一列的 root字段,如果有,则显示整行

awk -F ":" '$1 ~ /root/' passwd

10.以:分割,匹配第一列不存在 root字段的行,如果有,则显

示行号和第一列

awk -F ":" '$1 !~ /root/ {print NR,$1}' passwd

11. 在结果前打印 hello,可以是任何的字符

awk 'BEGIN{print "hello"}{print $0}' passwd

12. 在结果后打印 hello,可以是任何的字符

awk 'END{print "hello"}{print $0}' passwd

13.使用awk进行计算 + - * / 可以带() ^开方

awk 'BEGIN{print 2*3}'

14.比较 >大于 <小于 >=大于等于 <=小于等于 ==等于

awk -F ":" '$3<=88{print $1,$3}' passwd

命令 : cut

功能 : 对所需字符进行截取

参数

-d n: 定义分界符 , 即点位

-f n: 取第几位的字符

示例:

1.以:为分隔符,截取第一列。

cut -d ':' -f 1 passwd

2.以:为分隔符,截取第一和第七列。

cut -d ':' -f 1,7 passwd

分区 初级 的第 84

cut -d ':' -f 1,7 passwd

命令 :sort

功能 : 默认以排序 ASCII 方式进行排序 [a-z]

参数 :

-u 去除重复的行

-r 降序排序 [z-a]

-n 数值排序

-k 以文本的列进行判断

-t 设定分界符

示例 :

1. /etc/passwd 文件进行升序排序

sort /etc/passwd

2. /etc/passwd 文件进行降序排序

sort -r /etc/passwd

3. /etc/passwd 3 列进行数值排序 , 分界符为 :

sort -n -k 3 -t : /etc/passwd

4.对第 1 列的第 2 个字符开始至本列最后 1 个字符排序

sort -k 1.2 -t : /etc/passwd

命令 :wc

功能 : 统计行数、字数、字符数、文件总统计数

参数 :

-l 统计行数

-c 统计字节数

-w 统计字数 ( 单词数 )

六、sed

功能:通过指定的正则表达式完成指定关键字的过滤、截取、修

改等操作

语法格式:

sed ‘command’ filename(s)

特点:

1.sed属于一个流线式的非交互式的编辑器

2. sed在输入命令和文件名后,将在屏幕上输出

3.在不用重定向至文件之前,是不会改变文件现有内容。以避免

修改文件时出现问题

选项:

p 查看文件

d 删除内容

a 行的下方追加文字

i 行的上方插入文字

s 替换单词

c 替换行

y 替换字母

-e 执行多个条件

-f 调用条件文件

-n 抑制内存输出

-i 修改文件

\t tab

\t tab

\n 换行

/数字 第数字个

/g 全文

/w 写入另一个文件

/p 打印

'=' 给每行增加行号

-n '$=' 统计行数

-r 正则

示例:

sed -n 'p' passwd

#查看文件

sed 'aHELLO world' passwd

#在每一行下面添加

sed '5aHELLO world' passwd

#在第5行下添加

sed '2,4aHELLO world' passwd

#234行下添加

sed '5iHELLO world' passwd

#5行上方添加

sed '2,4iHELLO world' passwd

sed '3aHELLO world\nHELLO world' passwd

#换行

sed '3aHELLO world\n\t\tHELLO world' passwd

#换行+tab+tab

sed 'd' passwd

sed '3d' passwd

sed '3,5d' passwd

分区 初级 的第 88

sed '3,5d' passwd

sed 's/root/ROOOOT/' passwd

#替换,默认只替换查找到的第一个词

sed '3cHELLO world' passwd

#行的替换

sed 'y/s/S/' passwd

#字母替换,默认替换所有适配字母。

sed -e '10s/root/ROOT/;10s/sbin/BIN/' passwd

#多条件执行

sed -i 's/nologin/NOLOGIN/' passwd

#修改文件,脚本常用 默认是全局修改

sed 's/root/good/2' passwd

#指定替换第几个词

sed 's/root/good/g' passwd

#全局

sed 's/root/good/gw file1' passwd

#重定向替换后的文件

sed 's/root/good/2w file2' passwd

 

转载于:https://www.cnblogs.com/renyz/p/11266350.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值