标签:egrep及文本处理工具
egrep:
能够实现文本处理的三剑客:
文本过滤工具:grep
(其实grep家族中有三个工具,也就是实现文本过滤的工具有三个,grep, egrep,fgrep)
文本编辑工具:sed
文本报告生成器(格式化文本):awk
其实文本过滤工具除了grep之外还有egrep,fgrep
grep:基本正则表达式;
-E:选项表示支持扩展正则表达式;
-F:选项表示支持fgrep正则表达式;
egrep:扩展正则表达式;
-G:选项表示支持基本正则表达式;
-F:选项表示支持fgrep正则表达式;
fgrep:不支持正则表达式;
-E:选项表示支持扩展正则表达式;
-G:选项表示支持基本正则表达式;
所以上面的三种文本过滤工具,其中的任意一个命令都可以通过选项来支持其他的命令
egrep:
支持扩展的正则表达式实现类似于grep文本过滤功能; grep -E也相当于egrep
egrep [OPTIONS] PATTERN [FILE......]
选项:
-i -o -v -q -A -B -C
-G:支持基本正则表达式;
-F:支持fgrep正则表达式;
扩展正则表达式的元字符:
.:匹配任意单个字符;
[]:匹配指定范围内的任意单个字符;
[^]:匹配指定范围外的任意单个字符;
匹配次数:
注意:扩展正则表达式的匹配选项模式与基本正则表达式的匹配次数的写法,不同的地方是:基本正则表达式有反斜线的,在扩展正则表达式中没有了反斜线“\”
*:匹配任意次,0次,1次,或多次。
?:0次或1次,其前面的字符是可有可无的;
+:精确匹配其前面的字符至少一次;
{m}:其前面的字符m次;
{m,n}:匹配至少m次,至多n次;
{0,n}:最多匹配次;
{m,}:最少匹配m次;
位置锚定:
^:行首锚定;
$:行尾锚定;
\<,\b:词首锚定;
\>,\b:词尾锚定;
分组及引用:
():分组,括号内的模式匹配到字符会被记录于正则表达式引擎的内部中;
后向引用:\1 \2
或:
a|b:a或者b;
C|cat:表示的意思为,C或者是cat;
(c|C)at:表示cat,或者表示Cat;
练习:用扩展正则表达式来显示:
(1)显示/etc/passwd文件中不以/bin/bash结尾的行;
[root@centos6 ~]# egrep -v "/bin/bash$"/etc/passwd
[root@centos6~]# grep -v"/bin/bash$" /etc/passwd
[root@centos6~]# grep -E -v "/bin/bash$" /etc/passwd
(2)找出/etc/passwd文件中两位数或三位数;
错误的写法:[root@centos6 ~]# grep"[[:digit:]]\{2,3\}" /etc/passwd
正确的写法:[root@centos6 ~]# grep "\<[[:digit:]]\{2,3\}\>"/etc/passwd
或:[root@centos6 ~]# grep"\<[0-9]\{2,3\}\>" /etc/passwd
grep -E"\<[0-9]{2,3}\>" /etc/passwd //扩展正则表达式时,次数匹配时,可以不需 要转义的绳子。
总结:这里当匹配确定的几位数时,我们一定要锚定开头和结尾,因为,不锚定的话, 五位数,六位数,等等它都包含三位数。
(3)找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行;
错误的写法:grep -v ‘[[:space:]]$‘/etc/rc.d/rc.sysinit | grep ‘^[[:space:]]\+‘
正确的写法:[root@centos6 ~]# grep"^[[:space:]]\+[^[:space:]]" /etc/rc.d/rc.sysinit
(4)找出“netstat-tan”命令的结果中以“LISTEN”后跟0,1,或多个空白字符结尾的行;
分组及引用:
错误的写法:[root@centos6~]# netstat -tan | grep "LISTEN[[:space:]].*$"
正确的写法:[root@centos6~]# netstat -tan | grep"LISTEN[[:space:]]*$"
练习:
1.找出/proc/meminfo文件中,所有以大写或小写s开头的行;至少有三种实现方式;
解:
(1)[root@centos6~]# grep "^[S,s]" /proc/meminfo
[root@centos6~]# grep -i "^s"/proc/meminfo
(2)[root@centos6~]# grep -i "^\<s"/proc/meminfo
(3)[root@centos6~]# egrep -i "^\<s"/proc/meminfo
(4)[root@centos6~]# grep -E "^(S|s)" /proc/meminfo
2.显示当前系统上root,centOS,user1用户的相关信息;
解:
[root@centos6~]# grep -E"^(\<root\>|\<centos\>|\<user1\>)" /etc/passwd
或:
[root@centos6~]# grep -E"^(root|centos|user1)\>" /etc/passwd
3.找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行;
解:
[root@centos6~]# grep -o -E "[_[:alpha:]]+\(\)"/etc/rc.d/init.d/functions
4.使用echo命令输出一绝对路径,使用egrep取出基名;
解:
答案:
echo /etc/sysconfig | grep -E -o "[^/]+/?$"
分析:
我们可以用echo命令输出一个绝对路径,/etc/sysconfig,然后对这个 路径取其基名,基名就是最后面的目录或文件的基本名称,那么上面的路径的基名 就是“sysconfig”,然后我们可以使用grep或egrep命令将其取出来。
我们从右边开始取,取得内容为不以反斜线为行尾的“grep [^\]$”这样我们 检索 出来的还是整行,而不是只显示我们想要的基名,那么我们就用到选项“-o”
但是仅显示一个字母,所以我们加上一个“\+”表示从右端开始我们的字母至 少是一个,那么合起来就是这样写:echo /etc/sysconfig |grep -o "[^/]\+$"
得到的结果为:
用扩展正则表达式:echo /etc/sysconfig | grep -E -o"[^/]+$"
但是问题来了,如果我们的绝对路径为“/etc/sysconfig/”那么在用上面的命令就没有结果了:
那这种情况就是在行尾可能有一个反斜线“\”,那么我们的匹配命令就改写为:
echo /etc/sysconfig/ | grep -E -o"[^/]+/$"
但是这些行尾的反斜线可有可无,那么我们就在进行修改一下:
echo /etc/sysconfig/ | grep -E -o"[^/]+/?$"
拓展:
取出路径名:
解:
5.找出ifconfig命令结果中的1-255之间的数值;
解:ifconfig | grep -E -o"\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"
6找出ifconfig命令结果中的IP地址;
解:
7.添加用户bash,testbash,basher以及nologin(其shell为/sbin/nologin);而后找出 /etc/passwd文件中用名同shell名一样的行;
解:第一步先添加用户useradd
第二步过滤查找要找的内容: grep -E "^([^:]+\>).*\1$" /etc/passwd
fgrep:不支持正则表达式元字符:
当无需要用到元字符去编写模式时,使用fgrep必能更好;
文本查看及处理工具:
wc,cut,sort,uniq,diff,patch
wc:
word count:单词统计
功能:能够显示一个文件中的行数,单词数,字节数;
格式:
wc[OPTION]... [FILE]... //使用的格式,命令字,选项,加上文件,文件可以有多个;
举例:
[root@centos6~]# wc /etc/fstab
16 84899 /etc/fstab //显示:16行,84个单词,899个字节,(注意:这里说的 单词是指,连续的非特殊非特殊字符都是单词。)
[root@centos6~]#
[root@centos6 ~]# wc -l /etc/fstab //仅显示行数
16 /etc/fstab
[root@centos6 ~]# wc -w /etc/fstab //仅显示单词数
84 /etc/fstab
[root@centos6 ~]# wc -c /etc/fstab //仅显示字节数,也可以使用“-m”
899 /etc/fstab
[root@centos6 ~]#
cut
功能:文本截取工具
格式:
cut OPTION... [FILE]...
选项:(注意特性:选项与选项参数之间可以不加空格)
-d, --delimiter=DELIM:表示指明使用什么字段作为分隔符,如果不指明则默认为 使用空白字段作为分隔符;
空白字符的表示:用两个单引号中间加一个空格表示空白字段 : ‘ ‘
-f, --fields=LIST:表示仅保留那些字段,(选项参数有不同的表示如下用#表示数字
#:指定的单个字段;
#-#:连续的多个字段;
#,#:离散的多个字段;
举例:
[root@centos6~]# cut -d : -f 1,7/etc/passwd //表示以冒号作为分隔符,只保留第 一和第七字段,注意选项“-d”和选项“-f” 与他们后面的 参数之间可以有空格,也可已没有。
sort
功能:排序
格式:
sort [OPTION]... [FILE]...
注意:我们发现很多的文本处理工具默认条件下都不会修改源文件,只是把内容从源文件中 读出来,把处理结果输出到屏幕上;
(sort在排序时还可以指明几种选项,例如我们使用指定的字段进行排序,指明分隔符以后,以指定的字段进行排序,他跟“cut”一样,默认情况下从最左侧进行比较,如果不想从最左侧进行比较,那么依然需要指定分隔符)
-n:基于数值进行排序,而非字符;
-t CHAR:指定分隔符;
-k #:用于排序比较的字段;
-r:逆序排序;
-f:排序时不区分大小写;
-u:重复的行只保留一份;(重复的行定义:连续且相同)
举例:
[root@centos6~]# cut -d : -f 3 /etc/passwd|sort //看上去杂乱无章,其实是按照字符 进行排序的
0
1
10
11
113
12
13
14
170
173
2
27
29
3
32
38
4
42
48
497
498
499
5
500
501
502
503
504
505
506
507
6
65534
[root@centos6 ~]# cut -d : -f 3 /etc/passwd |sort -n //根据数值大小进行排序
0
1
2
3
4
5
6
7
8
10
11
12
13
14
27
29
32
38
42
48
68
69
72
74
81
89
99
113
170
如果是希望/etc/passwd文件上的每一个用户,都可以根据其ID号大小进行排序,如果再用“cut”先切,就不是我们想要的全部显示用户信息又能完成排序的结果了,那么这时我们应该用sort自己的切割机制,
[root@centos6 ~]# sort -t: -k3 -n /etc/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
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@centos6 ~]# cut -d: -f7 /etc/passwd |sort -u | wc -l //查看当前系统上一共有多少个 shell
5
[root@centos6 ~]#
[root@centos6 ~]# grep "bash$" /etc/passwd |wc -l //当前bash一共有多少人用
9
[root@centos6 ~]#
uniq
功能:报告或移除重复的行
格式:
uniq [OPTION]...[INPUT [OUTPUT]]
选项:
-c, --count:统计每一行重复出现的次数;
-u,--unique:仅显示未曾重复过的行;
-d,--repeated:仅显示重复过的行;
举例:
[root@centos6~]# cut -d: -f7 /etc/passwd|sort | uniq -c
9 /bin/bash //前面的9表示这种行重复出现过9次
1 /bin/sync
1 /sbin/halt
30 /sbin/nologin
1 /sbin/shutdown
[root@centos6~]#
diff
功能:逐行比较文件的不同之处;
格式:
diff [OPTION]... FILES
生成补丁文件:
diff /PATH/TO/OLDFILE /PATH/TO/NEWFILE > /PATH/TO/PATCH_FILE
-u:显示要修改的行的上下文,默认为三行;
patch
功能:向文件打补丁
打补丁:
patch [OPTIONS] -i /PATH/TO/PATCH_FILE /PATH/TO/OLDFILE
或:
patch /PATH/TO/OLDFILE < /PATH/TO/PATCH_FILE
演示:
[root@centos6 ~]# cp -f /etc/fstab ./fstab
cp: overwrite `./fstab‘? y
[root@centos6 ~]# cp -f /etc/fstab./fstab.new
[root@centos6 ~]# nano fstab.new
[root@centos6 ~]# cat fstab.new
#hahahaha
# /etc/fstab
# Created by anaconda on Tue Oct 1112:39:17 2016
#
# Accessible filesystems, by reference, aremaintained under ‘/dev/disk‘
# See man pages fstab(5), findfs(8),mount(8) and/or blkid(8) for more info
#
UUID=2ead7599-15b0-4b11-b96d-5f9b59e2e7eb/ ext4 defaults 1 1
UUID=edb28e3e-5ee7-400f-8226-fab5fa157188/boot ext4 defaults 1 2
UUID=32376552-a128-416d-be08-0aa6acab4661/testdir ext4 defaults 1 2
UUID=091e5b14-8201-4ffc-9278-41b7acae00d9swap swap defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
[root@centos6 ~]# diff fstab fstab.new
2c2
< # //表示老文件第二行的“#”给删除了。
---
> #hahahaha //表示给老文件第二行删除以后再新增一个“#hahahaha”作为替换
[root@centos6 ~]#
其实上面就是告诉我们可以打补丁,打完补丁后,让我的老文件跟新文件一模一样
[root@centos6 ~]# diff fstab fstab.new > fstab.patch //生成补丁文件
[root@centos6 ~]# mount /dev/cdrom /media //挂载光盘
[root@centos6 ~]# yum clean all
[root@centos6 ~]# yum repolsit
[root@centos6 ~]# yum info patch //查看打补丁工具patch是否安装上了
[root@centos6 ~]# patch -i fstab.patch fstab //打补丁
[root@centos6 ~]# cat fstab
[root@centos6 ~]# diff fstab fstab.new //再次进行比较
[root@centos6 ~]# patch -R -i fstab.patch fstab //将打好补丁的文件还原
[root@centos6 ~]# cat fstab
diff命令:
其实他的输出风格有多种:
[root@centos6 ~]# diff fstab fstab.new
2c2
< #
---
> #hahahaha
[root@centos6 ~]# diff -u fstab fstab.new //加了选项u,就有了不同的风格
--- fstab 2016-11-0103:07:25.802174424 +0800 //----表示老文件
+++ fstab.new 2016-11-01 02:49:12.213175145 +0800 //++++表示新文件
@@ -1,5 +1,5 @@
-# //表示老文件要减去这么一行
+#hahahaha //表示老文件加上这一行
#/etc/fstab //下面这三行表示上下文,说明我们修改的那行在什么位置
#Created by anaconda on Tue Oct 11 12:39:17 2016
#
[root@centos6 ~]#
练习:
取出ifconfig eno16777736命令结果中的IP地址;
解:
ifconfig | head -2 | tail -1 |cut -d:-f2 | cut -d ‘ ‘ -f1
截图如下:
本文出自 “11847750” 博客,请务必保留此出处http://11857750.blog.51cto.com/11847750/1875098
标签:egrep及文本处理工具
原文地址:http://11857750.blog.51cto.com/11847750/1875098