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 位置锚定:定位要锚定的字符出现的位置

  • ^:行首锚定,用于匹配模式的最左侧
  • $:行尾锚定,用于匹配模式的最右侧
    • ^$:空行
    • [1]$:空白行(空行或含有空白字符的行)
    • ^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 "[2]" /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


  1. [:space:] ↩︎

  2. sS ↩︎

原文地址:https://www.cnblogs.com/sstjustdoit/p/9995534.html