路漫漫其修远兮
吾将上下而求索

linux文本编辑:grep命令

linux处理文件三剑客:处理文本有三个常用的模式匹配命令 grep sed awk ,这三个命令十分灵活,应该熟练掌握

        grep:文本过滤工具(模式:pattern)工具

        sed:stream editor 流编辑器,文本编辑器

        awk:Linux上的实现为gawk,文本报告生成器(格式化文本)

1、简介

1、正则表达式:Regual Expression, REGEXP,由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于标示控制或通配功能

    分为两类:

            基本正则表达式:BRE

            扩展正则表达式:ERE

2、grep: Global search REgular expression and Print out the line

    作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查,打印匹配到的行,

    模式:由正则表达式的元字符及文本字符所编写出的过滤条件

2、语法

grep [options] PATTERN [FILE...]
grep [options] [-e PATTERN | -f FILE] [FILE...]

options:

--color=auto:对匹配到的文本着色后高亮显示
-i:ignorecase,忽略字符的大小写
-o:--only-matching,仅显示匹配到的字符串本身
-v:--invert-match,显示不能被模式匹配到的行
-n:显示匹配到的行号
-c:显示匹配到的行数
-E:--extended-regexp,支持使用扩展的正则表达式元字符
-q:quiet,silent:静默模式,不输出任何信息,关注的是执行的结果
-A#:after,后#行,显示匹配到的这行,同时显示这行的后面多少行
# cat /etc/passwd | grep -C2 '^adm'
-B#:before,前#行
-C#:context,前后各#行

定义颜色这样方便一些,注意,centos6上面没有定义这个别名,需要自己定义,而centos7上面自带这个别名,可以高亮显示

alias grep 'grep --color=auto'
alias egrep='egrep --color=auto'

3、基本正则表达式元字符

1、字符匹配:

.:匹配任意单个字符
[]::匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
[[:digit:]]:所有数字
[[:lower:]]:所有小写字母
[[:upper:]]:所有大写字母
[[:alpha:]]:所有字母,包括大小写
[[:alnum:]]:所有大小写,数字
[[:punct:]]:标点符号
[[:space:]]:空格和tab

2、次数匹配:用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数,默认工作于贪婪模式

测试用的文本文件

image.png

1)*:匹配其前面的字符任意次,0,1,多次,也就是说该字符即使没有也会匹配,比如下面的x,即使只有y,也符合条件

下面图片中,高亮的部分,表示模式匹配到的结果,没有高亮的表示不符合匹配模式

image.png

2).*:匹配任意长度的任意字符,也就是不管y之前有没有字符串,有什么字符串,只要有y,就能匹配到

image.png

3)\:转译符

\?:匹配其前面的字符0次或者1次,即前面的字符是可有可无的,和第一个区别,前面有5个也满足0次或者1次要求,前面有3个也满足上面的条件,所以也会显示

image.png

\+:匹配其前面的字符1次或者多次,即前面的字符要出现至少1次

image.png

\{m\}:匹配其前面的字符m次及以上

image.png

\{m,n\}:匹配其前面的字符至少m次,至多n次,因为工作在贪婪模式,即使后面还有x,依然会显示,也符合条件

image.png

\{0,n\):至多n次

image.png

\{m,\}:至少m次

3、位置锚定

1)^:行首锚定,用于模式的最左边

image.png

$:行尾锚定,用于模式的最右边

image.png

^PATTERN$: 用于PATTERN来匹配整行

image.png

4、单词:非特殊字符组成的连续字符(字符串)都称为单词

\<或者\b:词首锚定,用于单词模式的左侧
\>或者\b:词尾锚定,用于单词模式的右侧
\<PATTERN>:匹配完整单词

5、分组和引用

\(\):将一个或多个字符捆绑在一起,当做一个整体进行处理

xy\(xy\)*ab

NOTE:分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为:

\1:模式从左侧起,第一个左括号以及与之匹配的右括号(倒数第一个括号)之间的模式所匹配到的字符

\2:模式从左侧起,第二个左括号以及与之匹配的右括号(倒数第二个括号)之间的模式所匹配到的字符

\3:…

下面的例子,能匹配到前面的四个字符,并且中间不管是什么字符串,后面依然能够匹配到前面的那四个字符,这整个中间的都算匹配到了

image.png

pdf_test.pdf

《正则表达式30分钟教程》

4、练习

1、显示/etc/passwd文件中不以/bin/bash结尾的行

[root@localhost ~]#grep -v "/bin/bash$" /etc/passwd
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

2、找出/etc/passwd文件中的两位数或者三位数

# grep --color=auto "\<[0-9]\{2,3\}\>" /etc/passwd
# grep "\<[0-9]\{0,2\}\b" /etc/passwd,这个和下面的是一样的

image.png

3、找出/etc/rc.d/rc.sysinit或者/etc/grub2.cfg文件中,至少一个空白字符开头,且后面非空白字符的行

image.png

4、找出“netstat-tan”命令的结果中以‘LISTEN’后跟1,0或多个空白字符结尾的行

image.png

======================================================================

egrep:  或grep -E

1、格式

egrep [options] PATTERN [FILE...]

2、options,和上面的选项功能是一样的

-i
-o
-v
-q
-A
-B
-C
-G:支持基本正则表达式

3、字符匹配:

.:匹配任意单个字符
[]:匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
[[:digit:]]:所有数字
[[:lower:]]:所有小写字母
[[:upper:]]:所有大写字母
[[:alpha:]]:所有字母,包括大小写
[[:alnum:]]:所有大小写,数字
[[:punct:]]:标点符号
[[:space:]]:空格和tab

4、次数匹配:

用在要指定其出现的次数的字符的后面,用于限制其前面字符出现的次数,默认工作于贪婪模式,

*:匹配其前面的字符任意次,0,1,多次
.*:匹配任意长度的任意字符
?:匹配其前面的字符0次或者1次,即前面的字符是可有可无的
+:匹配其前面的字符1次或者多次,即前面的字符要出现至少1次
{m}:匹配其前面的字符m次及以上
{m,n}:匹配其前面的字符至少m次,至多n次
{0,n): 至多n次
{m,}: 至少m次

5、位置锚定:

^:行首锚定,用于模式的最左边
$:行尾锚定,用于模式的最右边
^PATTERN$:用于PATTERN来匹配整行

6、单词:

非特殊字符组成的连续字符(字符串)都称为单词

\<或者\b:词首锚定,用于单词模式的左侧
\>或者\b:词尾锚定,用于单词模式的右侧
\<PATTERN>:匹配完整单词

7、分组和引用

():将一个或多个字符捆绑在一起,当做一个整体进行处理
a|b: a或者b
C|cat: C或者cat
(C|c)at: Cat或者cat

8、练习:

1、找出/proc/meminfo文件中,所有以大写或小写s开头的行,至少有三种实现方法

image.png

查看进程是否存在
ps aux |grep zabbix | grep -v grep &> /dev/null
echo $?

显示目前系统上root、centos或user1用户相关信息
# grep -E "^(root|centos|user1)\>" /etc/passwd
找出/etc/rc.d/init.d/functions文件中某个单词后跟一个小括号的行
# grep -E "[_[:alpha:]]+\(\)"  /etc/rc.d/init.d/functions       [_[:alpha:]]和[_abcdefghijkl]一样的原理,
使用echo命令输出一绝对路径,使用egrep取出基名
# echo /etc/rc.d/init.d/functions | egrep -o "[^/]+/?$"   以非/开头的字符,至少一次,最后的/出现0次或者1次
# basename /etc/rc.d/init.d/functions
找出ifconfig命令结果中的1-255之间的数值
# ifconfig | egrep -o "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"    ():将一个或多个字符捆绑在一起,当做一个整体进行处理,里面是或的关系

显示/proc/meminfo文件中以大小s开头的行;(要求:使用两种方式)
# cat /proc/meminfo | grep "^[sS]"
# cat /proc/meminfo | grep -i "^s"
# egrep "^(s|S)" /proc/meminfo
显示/etc/passwd文件中不以/bin/bash结尾的行
# grep -v "/bin/bash$" /etc/passwd
显示用户rpc默认的shell程序
# cat /etc/passwd | grep "^rpc\>" | cut -d: -f7
找出/etc/passwd中的两位或三位数
# grep "\<[0-9]\{2,3\}\>" /etc/passwd
显示/etc/grub2.cfg文件中,至少以一个空白字符开头的且后面存非空白字符的行
# cat /etc/grub2.cfg | grep -n "^[[:space:]]\+[^[:space:]]"
找出“netstat -tan”命令的结果中以‘LISTEN’后跟任意多个空白字符结尾的行
# netstat -nt | tail -n +3 | grep "LISHED[[:space:]]*$"
添加用户bash、testbash、basher以及nologin(其shell为/sbin/nologin),而后找出/etc/passwd文件中用户名同shell名的行
grep  '^\<\(.*\)\>.*\1$' /etc/passwd
grep  '^\<\(.*\)\>.*\b\1\b$' /etc/passwd
显示三个用户root、mage、wang的UID和默认shell
egrep "^(root|wang|mage)\>" /etc/passwd | cut -d: -f3,7     没想到用()
找出/etc/rc.d/init.d/functions文件中行首为某单词(包括下划线)后面跟一个小括号的行
# egrep "[[:alpha:]_]+\(\)" /etc/rc.d/init.d/functions
使用egrep取出/etc/rc.d/init.d/functions中其基名
# echo /etc/rc.d/init.d/functions | egrep -o "[^/]+/?$"
# basename /etc/rc.d/init.d/functions
使用egrep取出上面路径的目录名
# echo "/etc/rc.d/init.d/functions/" | sed 's@[^/]\+/\?$@@'
# dirname /etc/rc.d/init.d/functions
统计以root身份登录的每个远程主机IP地址的登录次数
# last | egrep -o "^root\>.*([[:digit:]]\.){3}[[:digit:]]" |tr -s '' | cut -d' ' -f3 | sort | uniq -c
# last | egrep '(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])' | tr -s " " |cut -d" "  -f3 | uniq -c
利用扩展正则表达式分别表示0-9、10-99、100-199、200-249、250-255
[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]25[0-5]
显示ifconfig命令结果中所有IPv4地址
ifconfig | grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}'   能显示000-999
[root@localhost ~]# egrep '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'  test
999.999.999.999
0.0.0.0
000.000.000.000
444.098.098.789
4.546.432.645
# ifconfig | egrep '(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])' 显示0-255
正则表达式表示身份证号
# egrep  "[0-9]{18}|[0-9]{15}"  test
正则表达式表示手机号
#egrep '1[34578][0-9]{9}'  test
正则表达式表示邮箱
#egrep '[[:alnum:]]{6,18}@[[:alnum:]]+\.[[:alnum:]]+'  test
正则表达式表示QQ号
#egrep '[1-9][0-9]{0,11}'


找出在哪个命令下面哪些字符是特殊字符,哪些字符是正常字符,什么时候该用转义符,什么时候不用转义符,要记录

未经允许不得转载:江哥架构师笔记 » linux文本编辑:grep命令

分享到:更多 ()

评论 抢沙发

评论前必须登录!