在 Shell 下使用这些正则表达式处理文本最多的命令有下面几个工具:linux
命令 | 描述 |
grep | 默认不支持扩展表达式,加-E 选项开启 ERE。若是不加-E 使用花括号要加转义符\{\} |
egrep | 支持基础和扩展表达式 |
awk | 支持 egrep 全部的正则表达式 |
sed | 默认不支持扩展表达式,加-r 选项开启 ERE。若是不加-r 使用花括号要加转义符\{\}
|
sed [选项] [sed命令] [输入文件]正则表达式
说明:shell
1,注意sed软件以及后面选项,sed命令和输入文件,每一个元素之间都至少有一个空格。编程
2,sed -commands(sed命令)是sed软件内置的一些命令选项,为了和前面的options(选项)区分,故称为sed命令vim
3,sed -commands 既能够是单个sed命令,也能够是多个sed命令组合。数组
4,input -file (输入文件)是可选项,sed还可以从标准输入如管道获取输入。缓存
sed读取一行,首先将这行放入到缓存中bash
而后,才对这行进行处理app
处理完成之后,将缓冲区的内容发送到终端编程语言
存储sed读取到的内容的缓存区空间称之为:模式空间(Pattern Space)
option[选项] | 解释说明(带*的为重点) |
---|---|
-n (no) | 取消默认的sed软件的输出,常与sed命令的p连用。* |
-e (entry) | 一行命令语句能够执行多条sed命令 * |
-r (ruguler) | 使用扩展正则表达式,默认状况sed只识别基本正则表达式 * |
-i (inside) | 直接修改文件内容,而不是输出到终端,若是不使用-i选项sed软件只是修改在内存中的数据,并不会影响磁盘上的文件* |
sed -commands[sed命令] | 解释说明(带*的为重点) |
---|---|
a (append) | 追加,在指定行后添加一行或多行文本 * |
c (change) | 取代指定的行 |
d (delete) | 删除指定的行 * |
i (insert) | 插入,在指定行前添加一行或多行文本 * |
p (print) | 打印模式空间内容,一般p会与选项-n一块儿使用* |
特殊符号 | 解释说明(带*的为重点) |
---|---|
! | 对指定行之外的全部行应用命令* |
awk不只仅时linux系统中的一个命令,并且是一种编程语言,能够用来处理数据和生成报告(excel)。处理的数据能够是一个或多个文件,能够是来自标准输入,也能够经过管道获取标准输入,awk能够在命令行上直接编辑命令进行操做,也能够编写成awk程序来进行更为复杂的运用。
awk处理的内容能够来自标准输入(<),一个或多个文本文件或管道。
-F:指定分隔符
记录(record):一行就是一个记录
分隔符(field separator):进行对记录进行切割的时候所使用的字符
字段(field):将一条记录分割成的每一段
FILENAME:当前处理文件的文件名
FS(Field Separator):字段分隔符(默认是以空格为分隔符=)
NR(Number of Rrecord):记录的编号(awk每读取一行,NR就加1==)
NF(Number of Field):字段数量(记录了当前这条记录包含多少个字段==)
ORS(Output Record Separator):指定输出记录分隔符(指定在输出结果中记录末尾是什么,默认是\n,也就是换行)
OFS(Output Field Separator):输出字段分隔符
RS:记录分隔符
$1 $2 … $n 输出一个指定的字段
$NF 输出最后一个字段
$0 输出整条记录
正则表达式的运用,默认是在行内查找匹配的字符串,如有匹配则执行action操做,可是有时候仅须要固定的列来匹配指定的正则表达式,好比:我想取/etc/passwd文件中第五列{$5}这一列查找匹配mail字符串的行,这样就须要用另外两个匹配操做符,而且awk里面只有这两个操做符来匹配正则表达式。
BEGIN模块再awk读取文件以前就执行,通常用来定义咱们的内置变量(预约义变量,eg:FS,RS)
须要注意的是BEGIN模式后面要接跟一个action操做块,包含在大括号内。awk必须在输入文件进行任何处理前先执行BEGIN里的动做(action)。咱们能够不要任何输入文件,就能够对BEGIN模块进行测试,由于awk须要先执行完BEGIN模式,才对输入文件作处理。BEGIN模式经常被用来修改内置变量ORS,RS,FS,OFS等值。
数组构成:
数组名[元素名]=值
如图不难发现,awk数组就和酒店同样。数组的名称就像是酒店名称,数组元素名称就像酒店房间号码,每一个数组元素里面的内容就像是酒店房间里面的人。
例子1:添加单行
[root@ken ~]# sed ‘1a nihao’ test
root:x:0:0:root:/root:/bin/bash
nihao
bin:x:1:1:bin:/bin:/sbin/nologin
例子2:添加单行
[root@ken ~]# sed ‘2a nihao’ test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
nihao
例子3:添加多行
[root@ken ~]# sed ‘2a 1\n2\n3\n4\n5’ test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
1
2
3
4
5
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
例子4:行尾添加
[root@ken ~]# sed ‘$a nihao’ test
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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
nihao
增i
例子5:单行添加
[root@ken ~]# sed ‘1i nihao’ test
nihao
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
例子6:添加多行
[root@ken ~]# sed ‘1i 1\n2\n3\n4’ test
1
2
3
4
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
2.删d
例子1:删除指定行
[root@ken ~]# sed ‘1d’ test
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
例子2:删除多行
[root@ken ~]# sed ‘1,9d’ test
operator:x:11:0:operator:/root:/sbin/nologin
例子3:删除全文
[root@ken ~]# sed ‘d’ test
例子4:删除指定行到结尾的行
[root@ken ~]# sed ‘3,$d’ test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
3.改 c
接下来讲的这个功能,有工做经验的同窗应该很是的熟悉,由于使用sed软件80%的场景就是使用替换功能。
这里用到的sed命令,选项:
“s”:单独使用–>将每一行中第一处匹配的字符串进行替换==>sed命令
“g”:每一行进行所有替换–>sed命令s的替换标志之一(全局替换),非sed命令。
“-i”:修改文件内容–>sed软件的选项,注意和sed命令i区别。
例子1:改指定的行
[root@ken ~]# sed ‘1c nihao’ test
nihao
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
例子2:改指定的几行
[root@ken ~]# sed ‘1,3c nihao’ test
nihao
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
4.查p
例子1:打印第一行
[root@ken ~]# sed ‘1p’ test
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
例子2:不打印模式空间的内容
[root@ken ~]# sed -n ‘1p’ test
root:x:0:0:root:/root:/bin/bash
例子3:打印多行
[root@ken ~]# sed -n “1,5p” test
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
例子1:把全部行的第一个root替换为ken
[root@ken ~]# sed ‘s/root/ken/’ test
ken: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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/ken:/sbin/nologin
例子2:把全部行的root替换为ken
[root@ken ~]# sed ‘s/root/ken/g’ test
ken:x:0:0:ken:/ken:/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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/ken:/sbin/nologin
例子1:删除root开头的行
[root@ken ~]# sed ‘/^root/d’ test
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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
例子2:删除以sync结尾的行
[root@ken ~]# sed ‘/sync$/d’ test
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
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
例子3:仅仅匹配以root开头的行的root
[root@ken ~]# sed ‘/^root/{s/root/ken/g}’ test
ken:x:0:0:ken:/ken:/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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
例子4:使用sed开启selinux
[root@ken ~]# sed -i “s/\(SELINUX=\)disabled/\1enforcing/g” /etc/sysconfig/selinux
[root@ken ~]# cat /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing – SELinux security policy is enforced.
# permissive – SELinux prints warnings instead of enforcing.
# disabled – No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three two values:
# targeted – Targeted processes are protected,
# minimum – Modification of targeted policy. Only selected processes are protected.
# mls – Multi Level Security protection.
SELINUXTYPE=targeted
-e
例子1:删除空白行和井号注释的行
[root@ken ~]# sed -e “/^$/d” -e “/^#/d” test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
i#adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
第一种方法:
[root@ken ~]# cp test{,.bak}
[root@ken ~]# ls
anaconda-ks.cfg a.out ken1 test test1 test2 test.bak test.txt
[root@ken ~]# grep -v -E “(^$)|(^#)” test.bak
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
i#adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@ken ~]# grep -v -E “(^$)|(^#)” test.bak > test
[root@ken ~]# cat test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
i#adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
第二种方法:
[root@ken ~]# sed -i -e ‘/^$/d’ -e ‘/^#/d’ test.bak
[root@ken ~]# cat test.bak
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
i#adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
例子1:打印出来行号
[root@ken ~]# awk ‘{print NR,$0}’ test
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 i#adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
7 halt:x:7:0:halt:/sbin:/sbin/halt
8 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
9 operator:x:11:0:operator:/root:/sbin/nologin
例子2:打印出来2,5行的内容
[root@ken ~]# awk ‘NR>=2&&NR<=5{print $0}’ test
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
i#adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
分析awk处理过程:
读取文本第一行,首先会和匹配模式进行相匹配,若是发现第一行内容不和模式相匹配的话,就继续读取下一行
读取到第二行发现和模式相匹配,就会执行花括号里面的动做
而后继续读取下一行,发现和模式相匹配,就会执行花括号里面的动做
…
依次读取全文
例子3:打印多余五个字段的行
[root@ken ~]# awk -F “:” ‘NF>=5{print $0}’ test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
i#adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
例子4:打印一冒号为分隔符的最后一个字段
[root@ken ~]# awk -F “:” ‘{print $NF}’ test
/bin/bash
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/nologin
/sbin/shutdown
/sbin/halt
/sbin/nologin
/sbin/nologin
例子5:打印出来用户名以及对应的shell类型
[root@ken ~]# awk -F “:” ‘{print $1,$NF}’ test
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
i#adm /sbin/nologin
lp /sbin/nologin
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
operator /sbin/nologin
[root@ken ~]# awk -F “:” ‘{print $1,$7}’ test
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
i#adm /sbin/nologin
lp /sbin/nologin
shutdown /sbin/shutdown
halt /sbin/halt
mail /sbin/nologin
operator /sbin/nologin
[root@ken ~]# awk -F “:” ‘NR==2{print $1,$7}’ test
bin /sbin/nologin
例子6:输出每行行号和该行有几个字段
[root@ken ~]# awk -F “:” ‘{print NR,NF}’ test
1 7
2 7
3 7
4 7
5 7
6 7
7 7
8 7
9 7
例子1:打印出来以root开头的行
[root@ken ~]# awk ‘/^root/{print $0}’ test
root:x:0:0:root:/root:/bin/bash
[root@ken ~]# awk ‘/^root/’ test
root:x:0:0:root:/root:/bin/bash
例子2:打印出来以halt结尾的行
[root@ken ~]# awk ‘/halt$/{print $0}’ test
halt:x:7:0:halt:/sbin:/sbin/halt
例子3:第五个字段包含root的行
[root@ken ~]# awk -F “:” ‘$5~/root/{print $0}’ test
root:x:0:0:root:/root:/bin/bash
提示:
$5~/root/表示第五个区域(列)匹配正则表达式/root/,既第5列包含root这个字符串,则显示这一行。
例子1:
[root@ken ~]# awk -F “:” ‘BEGIN{print “user shell”}NR==2{print $1,$NF}’ test
user shell
bin /sbin/nologin
例子2:指定分隔符
[root@ken ~]# ip a | grep “global” | awk ‘BEGIN{FS=” +|/”}{print $3}’
192.168.64.4
例子1:
[root@ken ~]# awk ‘{print $0}END{print “this is end”}’ test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
i#adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
this is end
例子2:
[root@ken ~]# awk ‘BEGIN{i=0}/root/{i++}END{print i}’ test
2
或者
[root@ken ~]# awk ‘/root/{i++}END{print i}’ test
2
统计域名出现的次数:
第一种方法:
[root@ken ~]# cat test | cut -d “/” -f 3 | sort | uniq -c | sort -rn
25 www.taobao.com
13 www.sina.com
7 www.qq.com
第二种方式:awk数组
[root@ken ~]# cat test | awk -F “/+” ‘{ken[$2]++}END{ for ( i in ken) print i,ken[i]}’
www.sina.com 13
www.qq.com 7
www.taobao.com 25
[root@ken ~]# cat test | awk -F “/+” ‘{ken[$2]++}END{ for ( i in ken) print ken[i],i}’ | sort -rn25 www.taobao.com13 www.sina.com7 www.qq.com