天天看点

linux—shell中的正则表达式一、grep二、sed行编辑器三、awk

一、grep

1、grep概述

文本过滤命令:grep是一种文本搜索工具,根据用户指定的“模式”对目标文本进行匹配检查,打印匹配到的行;

grep:由正则表达式或者字符及基本文本字符所编写的过滤条件;

2、grep匹配字符

-E 拓展正则表达式

grep root passwd 查找包含root的关键词

[[email protected] mnt]# cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
westos:x:0:0:root:/root:/bin/bash
test:x:0:0:root:/rootwestos:/root
test:x:0:0:root
redhat:x:0:0:westosroot
           
grep -E "\<root" passwd      模糊匹配以root开头的词
root:x:0:0:root:/root:/bin/bash
westos:x:0:0:root:/root:/bin/bash
test:x:0:0:root:/rootwestos:/root
test:x:0:0:root
[[email protected] mnt]# grep -E "root\>" passwd   模糊匹配以root字符结尾的关键词
root:x:0:0:root:/root:/bin/bash
westos:x:0:0:root:/root:/bin/bash
test:x:0:0:root:/rootwestos:/root
test:x:0:0:root
redhat:x:0:0:westosroot
[[email protected] mnt]# grep -E "\<root\>" passwd   精确匹配root字符
root:x:0:0:root:/root:/bin/bash
westos:x:0:0:root:/root:/bin/bash
test:x:0:0:root:/rootwestos:/root
test:x:0:0:root
[[email protected] mnt]# grep -E -i "\<root\>" passwd   忽略大小写匹配root字符
root:x:0:0:root:/root:/bin/bash
westos:x:0:0:root:/root:/bin/bash
test:x:0:0:root:/rootwestos:/Root
test:x:0:0:root
[[email protected] mnt]# grep -E -i "^\<root\>" passwd    忽略大小写匹配root开头额行
root:x:0:0:root:/root:/bin/bash
[[email protected] mnt]# grep -E -i "\<root\>$" passwd    忽略大小写匹配root结尾的行
test:x:0:0:root:/rootwestos:/Root
test:x:0:0:root
[[email protected] mnt]# grep -E -i "root|ROOT" passwd 模糊过略root或ROOT字符
root:x:0:0:root:/root:/bin/bash
westos:x:0:0:root:/root:/bin/bash
test:x:0:0:root:/rootwestos:/Root
test:x:0:0:root
redhat:x:0:0:westosroot
           

2、…的使用(贪婪匹配)

grep -E "x.." file	查找file中有x且后面有两个字符的行
grep -E "x..\>" file	查找file中有x且后面只有两个字符的行
grep -E "\<x.." file	查找file中有x开头且后面有两个字符的行
grep -E "\<x..\>" file	查找file中有x开头且后面只有两个字符结尾的行
grep -E "\<..y\>" file	查找file中有两个字符开头且以y结尾的行
grep -E "..y\>" file	查找file中有两个字符在前面且y结尾的行
           

示例:

linux—shell中的正则表达式一、grep二、sed行编辑器三、awk

3、* ? {} , + 等字符的匹配查找

grep -E "x*y" file	查找file中x字符出现任意次后面有y的行
grep -E "x?y" file	查找file中x字符出现0到1次后面有y的行
grep -E "\<x?y" file	查找file中x出现1次开头以y结尾的行
grep -E "\<x{2}y" file	查找file中x出现两次下一个字符是y的行
grep -E "\<x{0,2}y" file查找file中x出现0到2次打头后面有y的行
grep -E "\<x+y" file	查找file中x最少出现1次以上且开头后面有y的行
grep -E "(xy)+" file	查找file中xy出现一次以上的行
grep -E "(xy)+\>" file	查找file中xy出现一次且结尾的行
           

示例:

linux—shell中的正则表达式一、grep二、sed行编辑器三、awk
linux—shell中的正则表达式一、grep二、sed行编辑器三、awk

二、sed行编辑器

用来操作ASCII码的文本,处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,可以指定仅仅处理那些行。sed符合模式田间的处理,不符合的不处理,处理完成之后把缓冲区的内容送往屏幕,接着处理下一行,这样不断重复,知道文件末尾,不对原文件内容作修改

1、sed命令格式

sed 参数 命令 目标

p模式:显示

sed -n '/\#/p'  fstab 	   显示fstab中包含#的行
sed -n '/UUID/p' fstab	   显示fstab中包含UUID的行
sed -n '/^UUID/p' fstab	   显示fstab中UUID开头的行
sed -n '/UUID$/p' fstab	显示fstab中UUID结尾的行
set -n '5p'	fstab	       显示fstab中的第五行
sed -n '3,5p'	fatab	   显示fstab中的第三到第五行
sed -n '3,5!p'	fatab	  显示除了第三行到第五行的其他行
sed -ne '3p;5p;8p'fstab	   显示fstab中的第三,第五,第八行 -e为多条命令连接
sed -n '/\#/p' -i fstab    显示fstab中的包含#的行,并输入到fstab中
           

d模式:删除

sed '/^#/d'  fstab	    删除fstab中#开头的行并显示在屏幕
sed '/^UUID/d' fstab	删除fstab中UUID开头的行并显示
sed '/UUID$/d' fstab	 删除fstab中UUID结尾的行并显示
sed '1,4d' fstab	    删除fstab中第1到4行并显示其他行
sed   '/^UUID/!d' fstab	删除除了UUID开头的行并显示
           

a模式:添加

sed '/UUID$/a hello' fstab	     显示fstab内容并在UUID结尾的行后添加一行hello
sed '/UUID$/a hello\nsed\ntest' 显示fstab内容并在UUID结尾的行后添加一行hello和一行test
           
linux—shell中的正则表达式一、grep二、sed行编辑器三、awk

c模式:替换

sed '/^UUID/c/hello' /mnt/fstab   替换UUID开头的行为hello
           
linux—shell中的正则表达式一、grep二、sed行编辑器三、awk

w模式:插入

sed '/^UUID/w /mnt/hello'  /mnt/fstab	将/mnt/fstab中的UUID开头的行输入到/mnt/hello中
           
linux—shell中的正则表达式一、grep二、sed行编辑器三、awk

sed的其他用法

sed '/^UUID/mnt/fstab='/mnt/fstab	显示UUID开头的行的行数
sed '6r /mnt/hello1' /mnt/fstab 	将fstab中的第六行插入到hello1中
sed '6r /mnt/hello1' /mnt/fstab 	最后一行
sed '1r /mnt/hello1' /mnt/fstab		第一行
sed 'r /mnt/hello1' /mnt/fstab		每一行
sed -n '/^UUID/=' fstab		        显示行数
sed -n -e '/^UUID/p' -e '/^UUID/=' fstab多策略
sed -n -f westos fstab			westos中为策略(/^UUID/p
/^UUID/=)
sed 's/\# *//g' fstab 
sed '/by/,/See/s/\#\ *//g' fstab 
sed 'G' fstab 
sed '$!G' fstab 
sed '=' fstab | sed 'N;s/\n//'
sed '=' fstab | sed 's/\n//'
sed -n '$p' fstab 	显示倒数第一行
sed -n '4p' fstab     显示第四行 
sed '/^UUID/c\hello' fstab 
           

三、awk

awk -F : '/bash$/{ print $1 }' passwd  列出passwd文件以/bash结尾的行的第一列
awk -F : 'BEGIN{ print "NAME" }{ print $1 } END { print "END" }' passwd 
awk -F : 'NR==3{ print $1 }'  passwd     显示passwd第三行第一列
实现,列出eth0的ip
ifconfig eth0 | awk -F " " '/inet /{print $2}'
           
linux—shell中的正则表达式一、grep二、sed行编辑器三、awk
[[email protected] mnt]# ifconfig eth0 | awk -F " " '/inet /{print $2}'
172.25.254.177