grep与正则表达式
Posted sstjustdoit
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了grep与正则表达式相关的知识,希望对你有一定的参考价值。
一、正则表达式
正则表达式:Regual Expression, REGEXP。
由一类特殊字符及文本字符所编写的模式,其中有些字符不表示其字面意义,而是用于表示控制或通配的功能;
基本正则表达式:BRE
扩展正则表达式:ERE
1.基本正则表达式的元字符
1.1 字符匹配:
- . :匹配任意单个字符
- []:匹配指定范围内的任意单个字符
- [^]:匹配指定范围外的任意单个字符
- [:digit:] 数字
- [:lower:] 小写字母
- [:upper:] 大写字母
- [:alpha:] 字母
- [:alnum:] 数字
- [:punct:] 标点符号
- [:space:] 垂直或水平的空白字符
1.2 匹配次数:用在要指定次数的字符后面,用于指定前面的字符要出现的次数;
- *:匹配前面的字符任意次,包括0次;贪婪模式(尽可能长的匹配)
- .:任意单个字符
- .*:任意长度的任意字符
- ?:匹配前面的字符0次或1次
- +:匹配前面的字符至少1次
- {n}:匹配前面的字符n次
- {n,m}:匹配前面的字符n至m次
- {n,}:匹配前面的字符至少n次
- {,m}:匹配前面的字符至多m次
1.3 位置锚定:定位要锚定的字符出现的位置
- ^:行首锚定,用于匹配模式的最左侧
- $:行尾锚定,用于匹配模式的最右侧
- ^$:空行
- ^[[:space:]]$:空白行(空行或含有空白字符的行)
- ^PATTERN$:用于PATTERN来匹配整行
- < 或 词首锚定,用于单词模式的左侧
- > 或 词尾锚定,用于单词模式的右侧
- PATTERN 或<PATTERN> 匹配整个单词
注意:非特殊字符组成的连续字符(字符串)都称为单词;
1.4 分组及引用:() 将一个或多个字符捆绑在一起,当做一个整体进行处理;如(root)+,表示将root分为一组,且匹配至少1次
1:模式从左侧起,第一个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
2:模式从左侧起,第二个左括号以及与之匹配的右括号之间的模式所匹配到的字符;
3:
示例:(string1+(string2))
1:(string1+(string2))
2:(string2)
或者:|
示例:
a|b :a或b
C | cat:C或cat
(C|c)at:Cat或cat
二、grep、egrep、fgrep
grep:Global search REgular expression and Print out the line.
作用:文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查;打印匹配到的行;
模式:由正则表达式字符及文本字符所编写的过滤条件
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
# option:
--color=auto:对匹配到的文本着色后高亮显示;
-i:ignorecase,忽略字符的大小写;
-o:仅显示匹配到的字符串本身;
-w:显示匹配到的整个单词
-v, --invert-match:显示不能被模式匹配到的行;
-e:实现多个选项间的逻辑or关系
-n:显示匹配的行号
-c: 统计匹配的行数
-E:支持使用扩展的正则表达式元字符;
-q, --quiet, --silent:静默模式,即不输出任何信息;
-A 5:after, 后5行
-B 5:before,前5行
-C 5:context,前后各5行
三、几个文本查看工具:wc, cut, sort, uniq, diff, patch
1.wc:word count
wc - print newline, word, and byte counts for each file
wc [OPTION]... [FILE]...
~]# wc anaconda-ks.cfg
66 167 1858 anaconda-ks.cfg
# 66:表示行数
# 167:表示字数
# 1858:字节数
# option
-l:只计数行数
-w:只计算单词总数
-c:只计数字节总数
-m:只计数字符总数
2.cut:remove sections from each line of files
cut OPTION... [FILE]...
# option:
-d --delimiter=DELIM : 指明分隔符,默认tab
-f --fields=LIST :
# :指定第#个字段
#-#:指定第#-#个字段;如3-5,第3-5个字段
#,#:指定离散的多个字段;如3,5,7
#,#-#:
3.sort:sort lines of text files
把整理过的文本显示在STDOUT,不改变原始文件
sort [OPTION]... [FILE]...
# option:
-n:基于数值大小而非字符进行排序;
-r:逆序排序;
-f:忽略字符大小写
-t CHAR:指定分隔符; (类似cut的-d命令)
-k #:用于排序比较的字段;(类似cut -f 命令)
-u:连续且相同的重复的行只保留一行;
4.uniq:report or omit repeated lines
报告或移除重复的行
uniq [OPTION]... [INPUT [OUTPUT]]
# option
-c:显示每行的重复次数;
-u:仅显示未曾重复过的行;
-d:仅显示重复过的的行;
# 常和sort一起使用:
sort userlist.txt | uniq-c
5.diff、patch
diff - compare files line by line
patch - apply changes to files
diff [OPTION]... FILES
diff /PATH/TO/OLDFILE /PATH/TO/NEWFILE > /PATH/TO/PATCH_FILE
-u:使用unfied机制,即显示要修改的行的上下文,默认为3行,适用于补丁文件;
###
patch:复制在其它文件中进行的改变(要谨慎使用),即向文件打补丁;
patch [OPTIONS] -i /PATH/TO/PATCH_FILE /PATH/TO/OLDFILE
patch /PATH/TO/OLDFILE < /PATH/TO/PATCH_FILE
-b:自动备份改变了的文件
6.cat、tac、rev
cat - concatenate files and print on the standard output
cat [OPTION]... [FILE]...
# option:
-E: 显示行结束符$
-n: 对显示出的每一行进行编号
-A:显示所有控制符
-s:压缩连续的空行成一行
###
tac - concatenate and print files in reverse (反向显示cat的输出结果)
tac [OPTION]... [FILE]...
###
rev - reverse lines of a file or files
rev [options] [file ...]
7.more、less
分页查看文件内容
8.head、tail
head - output the first part of files 默认显示前10行
tail - output the last part of files 默认显示后10行
head [OPTION]... [FILE]...
# option:
-n #: 指定获取前#行
-c #: 指定获取前#字节
-#:指定行数
###
tail [OPTION]... [FILE]...
# option:
-n #: 指定获取后#行
-c #: 指定获取后#字节
-#:指定行数
-f: 跟踪显示文件fd新追加的内容,常用日志监控;相当于--follow=descriptor
-F: 跟踪文件名,相当于—follow=name --retry
四、练习
1、显示/etc/passwd文件中不以/bin/bash结尾的行;
~]# grep -v "/bin/bash$" /etc/passwd
2、找出/etc/passwd文件中的两位数或三位数;
~]# grep "<[0-9]{2,3}>" /etc/passwd
3、找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行;
~]# grep "^[[:space:]]+[^[:space:]]" /etc/grub2.cfg
4、找出"netstat -tan"命令的结果中以‘LISTEN‘后跟0、1或多个空白字符结尾的行;
~]# netstat -tan | grep "LISTEN[[:space:]]*$"
1、找出/proc/meminfo文件中,所有以大写或小写S开头的行;至少有三种实现方式;
~]# grep -i "^s" /proc/meminfo
~]# grep "^[sS]" /proc/meminfo
~]# grep -E "^(s|S)" /proc/meminfo
2、显示肖前系统上root、centos或user1用户的相关信息;
~]# grep -E "^(root|centos|user1)>" /etc/passwd
3、找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行;
~]# grep -E -o "[_[:alnum:]]+()" /etc/rc.d/init.d/functions
4、使用echo命令输出一绝对路径,使用egrep取出基名;
~]# echo /etc/sysconfig/ | grep -E -o "[^/]+/?$"
进一步:取出其路径名;类似于对其执行dirname命令的结果;
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地址;
~]# ifconfig | grep -o "([0-9]{1,3}.){3}[0-9]{1,3}" --color=auto
7、添加用户bash, testbash, basher以及nologin(其shell为/sbin/nologin);而后找出/etc/passwd文件中用户名同shell名的行;
~]# grep -E "^([^:]+>).*1$" /etc/passwd
以上是关于grep与正则表达式的主要内容,如果未能解决你的问题,请参考以下文章