正则表达式概念
grep命令详解
详解linux正则表达式(基础正则表达式+扩展正则表达式)
是一种通过符号和字符串进行匹配规则的,对文件内容的查询结果进行影响。
正则表达式是由普通字符和元字符构成。
1.其中普通字符包括大小写字母,数字,标点符号及一些其它符号。
2.而元字符则是指那些在正则表达式中有特殊意义的专用字符,可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式。
常用正则:grep、sed、awk、pgrep、mkdir、touch……
touch a{1…100}.txt
[root@localhost ~]# ifconfig ens33 | grep "inet 192.168.6.20 " | awk ‘{print $5}’
broadcast
(1)n:显示行号,查询的指定字符串在文件中所在的行号
grep -n "ServerName" /usr/local/httpd/conf/httpd.conf
(2)i:显示内容不区分大小写
grep -in "ServerName" /usr/local/httpd/conf/httpd.conf
(3)v:反向查询,显示不包含指定字符串的行
grep -vn "ServerName" /usr/local/httpd/conf/httpd.conf
(3)[ ] :匹配[ ]中任意字符,or的意思
grep -in "Server[Nn][avty]me" /usr/local/httpd/conf/httpd.conf
[root@localhost ~]# grep -n shu[twqwqn]do[abcde]n /etc/passwd
[root@localhost ~]# grep -n shu[twqwqn]do[abcdew]n /etc/passwd
7:shutdown:x :6:0:shutdown:/sbin:/sbin/shutdown
(4)^ :以指定的字符或字符串开头
grep -n "^[Ss]" /usr/local/httpd/conf/httpd.conf
(5)$ :放在字符串前面,表示调用变量,字符串为变量名。放在字符串后面,表示以该字符串结尾。
特殊用法: $ abc {$ 表示调用变量}
注意:如果结尾为.则需要加转义符。因为.在 正则表达式中也是一个元字符,所以需要用转义符\将具有特殊意义的字符转化成普通字符。
grep -n "html$" /usr/local/httpd/conf/httpd.conf
grep -n "\.$" /usr/local/httpd/conf/httpd.conf
df | grep "/$"
cat httpd.conf | grep "\.$"
grep "com:80$" httpd.conf
(6)^$ :显示空行
grep -n "^$" /usr/local/httpd/conf/httpd.conf
(7)
[起始数字-结束数字] : 在指定的数字范围之间 [1-10]
[起始字母-结束字母] : 在指定的字母范围之间 [a-u]
grep -n “[A-Z]” /usr/local/httpd/conf/httpd.conf
[A-Z] :连续范围的数字或字母
数字举例:
[root@localhost ~]# grep -n ^[1..5] /etc/passwd [*..*]这种写法是错误的
43:123:x:1000:1000:123:/home/123:/bin/bash
44:10
[root@localhost ~]# grep -n ^[1-30] /etc/passwd 正确写法
43:123:x:1000:1000:123:/home/123:/bin/bash
44:10
45:20
[root@localhost ~]# grep -n ^[1-10] /etc/passwd 特殊情况
43:123:x:1000:1000:123:/home/123:/bin/bash
44:10
(1)取反值
格式一、
^[^] :取反值,不是以指定字母开头的字符串
查找“oo”前不是“w”的字符串
grep -n '[^w]oo' test.txt
格式二、
[^] : 取反值,查询出包含“除指定的字母或数字范围外”的字符串
[^a-z] [^A-Z] [^0-9]
grep "[^a-z]ork" httpd.conf
(2){ } :指定之前的字符重复出现的数量,{ } 需要加转义符 还有:\. \* \( \) \$ \/
指定字符{数字1,数字2} : 表示字符串中,指定字符连续出现的数量范围 “wo{2,5}rk”
指定字符{数字1} : 表示字符串中,指定字符连续出现的数量范围 “wo{2}rk”
例:
查询包含1-3个o的字符串
grep -n 'wo\{1,3\}d' test.txt o\{1,3\}
查询数量为2以上连续出现的字符串
grep -n 'o\{2\}' test.txt o\{2\} oooo:这也是oo的双倍
(3)正则中的通配符:
. 代替一个字符,可以连续使用,不能代表空值
* 代替一组字符,可以为空
.* 字符可有可无
grep ‘r…o’ /etc/passwd
查询r和o中间有2个字符的,空格算一个字符
grep -n ‘ooo*’ /etc/passwd.old
查询两个o以上的字符串
在查询“oo o*”中,必须以oo成对出现的,而在查询“ooo o*”,必须以ooo成对出现
如果是“o o*”,则第一个o必须存在,第二个o是零个或者多个,所以包含o、oo、ooo、oooo、……
若查询“oo o*”,查询两个o以上的字符串。搜索关键字是两a。包含oo、ooo、oooo、……
若查询“ooo o*”,查询三个o以上的字符串。包含ooo、oooo、……
grep -n ‘.*’ /etc/passwd.old
所有都出现
在shell中,增加了一些更简化的正则表达式元字符,只有一小部分命令支持扩展正则表达式。
使用命令:
grep命令仅支持基础正则表达式。如果使用扩展正则表达式,需要使用egrep或awk命令!
1)egrep -n ‘woo+d’ test.txt #“wo{2,}rk"可以写成"wo+rk”
+ :重复一个或者一个以上的前一个字符
2)egrep -n ‘o?oo’ test.txt #代表查询指定文件中包含oo,且第一个o可要可不要的字符串
? :零个或者一个的前一个字符
3)egrep -n ‘o?’ test.txt
查询没有或有一个以上o的字符串
4)egrep -n ‘oo?’ test.txt
查询一个或有一个以上o的字符串
5)egrep -n ‘ooo?’ test.txt
查询两个或有两个以上o的字符串
6)egrep -n ‘name|Name’ /usr/local/httpd/conf/httpd.conf
查询文件中与指定字符串相同的内容
7)egrep -n ‘t(a|e)st’ /usr/local/httpd/conf/httpd.conf (只能对某一字符进行限制)
查询“组”字符串
8)egrep -n ‘A(xyz)+C’ /usr/local/httpd/conf/httpd.conf
#查询开头的“A”结尾是“C”,中间有一个以上的“xyz”字符串的意思。(一个以上代表:xyzxyzxyz...)
辨别多个重复的组
以上后三个必须加引号,而之前的可加可不加!!!
shell编程三剑客: GREP SED AWK
sed命令教学
awk命令教学
【1】sed是一种在线编辑器,它一次处理一行内容。
Sed主要作用:
用来自动编辑一个或多个文件;
简化对文件的反复操作;
编写转换程序等。
【默认情况下,所有的sed命令都是在模式空间内执行的(也就是不修改源文件)!因此输入的文件并不会发生任何变化,除非是用重定向存储输出 】
用法:
两种格式
sed [选项] ‘操作’ 参数
sed [选项] -f scriptfile 参数
[选项]
常见的sed命令选项主要包含以下几种:
-n、–quiet或silent:仅显示处理后的结果
-i:编辑文本内容
-e或-expression=:用指定命令或者脚本来处理输入的文本文件
-f或-file=:用指定的脚本文件来处理输入的文本文件
-h或–help:显示帮助
‘操作’
“操作”用于指定对文件操作的动作行为,也就是sed命令。通常情况下是采用“[n1[,n2]]”操作参数的格式。n1、n2是可选的,不一定会存在,代表选择进行操作的参数。
如:操作需要在5~20行之间进行,则表示为“5,20动作行为”。
常见的操作包括以下几种:
a: 增加,在当前行下面增加一行指定内容。
c: 替换,将选定行替换为指定内容
d: 删除,删除选定的行
i : 插入,在选定行上面插入一行指定内容
p: 打印, 如果同时指定行,表示打印指定行。如果不指定行,则表示打印所有内容。如果有非打印字符,则以ASCII码输出。其通常与“-n”选项一起使用。
s : 替换,替换指定字符
y: 字符转换
参数:是指操作的目标文件。当存在多个操作对象时,文件之间用逗号“,”分隔!
而scriptfile表示脚本文件,需要用选项“-f”指定。当脚本文件出现在目标文件之前时,表示通过指定的脚本文件来处理输入的目标文件。
sed -i ‘1a#chkconfig:35 25 25’ /usr/local/httpd/conf/httpd.conf 注意,不能给空文件添加数据。
cp /usr/local/httpd/conf/httpd.conf /usr/local/httpd/conf/httpd.txt
head -16 /usr/local/httpd/conf/httpd.txt
删除指定范围的行:
sed -i “360,364d” /usr/local/httpd/conf/httpd.txt
sed -i “355, +10d” /usr/local/httpd/conf/httpd.txt
vim a.txt
server
SERVER
Server
aaabaaaa
dddkdda
sed -i ‘s/server/SERVER1/’ a.txt
将每行的第一个字符串进行修改
sed -i ‘s/server/SERVER1/3’ a.txt
后面的数字3代表将每行的【第几个同名字符串】进行修改
sed -i ‘/server/c #haha’ /a.txt
替换指定字符串所在的行
只替换指定的字符串,不会替换整行。
sed -i ‘s/server/SERVER/g’ /a.txt 后面的g表示对全文进行修改
【2】awk:功能强大的编辑工具。逐行读取输入文本,并根据指定的匹配模式进行查找(一般多用于显示指定的字段)
【1】分割符,默认为空格分割符。将文件的每一行的第一个字段分割出来
awk -F: ‘{print $1}’ /etc/passwd
awk ‘{print}’ /a.txt = cat /a.txt
awk ‘{print $0}’ /a.txt = cat /a.txt awk使用$0表示整个行(记录)
【2】输出第一到第三行内容
awk 'NR==1,NR==3{print $0}' /a.txt
awk '(NR>=1)&&(NR<=3){print}' /a.txt
【3】输出第一和第三行内容
awk 'NR==1||NR==3{print}' /a.txt
【4】
awk ‘(NR%2)==0{print}’ /a.txt
输出所有偶数行内容
awk ‘(NR%2)==1{print}’ /a.txt
输出所有奇数行内容
awk ‘/^root/{print}’ /etc/passwd
输出以root开头的行
awk ‘/nologin$/{print}’ /etc/passwd
输出以nologin结尾的行
awk ‘BEGIN{X=0};//bin/bash$/{x++};END{print x}’ /etc/passwd
统计以bin/bash结尾的行数
拓展:
awk包含几个特殊的内置变量(可直接用)
FS : 指定每行文本的字段分隔符,默认为空格或制表位
NF : 当前处理的行的字段个数
NR:当前处理的行的行号(序数)
$0 :当前处理的行的整行内容
$n :当前处理行的第n个字段(第n列)
FILENAME:被处理的文件名
RS :数据记录分隔。默认为n,即每行为一条记录
-F: 指定 :为分隔符,默认为空格分隔
让我们一起努力,加油!!!
LAMP动态网站平台