shell学习----正则表达式

在使用sed和gawk时若是可以熟练的使用正则表达式,能够准确的过滤到本身须要的信息linux

Linux中,有两种流行的正则表达式引擎:git

  • POSIX基础正则表达式,BRE引擎
  • POSIX扩展正则表达式,ERE引擎

 

1、BRE模式

1.1 纯文本

基本上没什么可写的,区分大小写,多个空格也能够匹配。正则表达式

 

1.2 特殊字符

正则表达式识别的特殊字符包括这些,若是须要使用特殊字符,须要转义符(\)。ide

.*[]^${}\+?|()

 

 1.3 锚字符

  • 或字符(^)锁定在行首
  • 美圆符($)锁定在行尾
  • 两个组合(^$)能够过滤空行
sed -n '/^this/p' data3 
echo "This ^ is a test" | sed -n '/s ^/p'

echo "This is a good book" | sed -n '/book$/p'
echo "This book is good" | sed -n '/book$/p'

sed -n '/^this is a test$/p' data4
sed '/^$/d' data5
使用例子

 

1.4 点号字符

 匹配除换行符以外的任意单个字符。this

sed -n '/.at/p' data6

 

1.5 字符组

 使用方括号来定义字符组spa

sed -n '/[ch]at/p' data6
echo "Yes" | sed -n '/[Yy]es/p'

 

1.6 排除型字符组

 也能够反转字符组的做用,在字符组的开头加个脱字符code

sed -n '/[^ch]at/p' data6

 

1.7 区间

 用破折号能够表示字符中间的内容,第一个字符,破折号,最后一个字符blog

sed -n '/^[0-9][0-9][0-9][0-9][0-9]$/p' data8

 

1.8 特殊的字符组

  • [[:alpha:]]       匹配任意字母字符,无论是大写仍是小写
  • [[:alnum:]]           匹配任意字母数字字符0~九、A~Z或a~z
  • [[:blank::]]           匹配空格或制表符
  • [[:digit:]]              匹配0~9之间的数字
  • [[:lower:]]            匹配小写字母字符a~z
  • [[:print:]]             匹配仍以可打印字符
  • [[:punct:]]           匹配标点符号
  • [[:space:]]          匹配任意空白字符:空格、制表符、NL、FF、VT和CR
  • [[:upper:]]          匹配任意大写字母字符A~Z

这些表达式能够像普通字符组同样使用。it

echo "abc" | sed -n '/[[:digit:]]/p'
echo "abc" | sed -n '/[[:alpha:]]/p'
echo "abc123" | sed -n '/[[:digit:]]/p'

 

1.9 星号

星号代表该字符必须在匹配模式的文本中出现0次或屡次 event

echo "ik" | sed -n '/ie*k/p'
echo "iek" | sed -n '/ie*k/p'
echo "ieek" | sed -n '/ie*k/p'
echo "ieeek" | sed -n '/ie*k/p'

 

2、ERE模式

2.1 问号

问号代表前面的字符能够出现0次或1次。

echo "bt" | gawk '/be?t/{print $0}'
bt
echo "bet" | gawk '/be?t/{print $0}'
bet
echo "beet" | gawk '/be?t/{print $0}'

echo "beeet" | gawk '/be?t/{print $0}'

 

2.2 加号

加号代表前面的字符能够出现1次或屡次,但必须至少出现1次。

echo "beeet" | gawk '/be+t/{print $0}'

echo "beet" | gawk '/be+t/{print $0}'

echo "bet" | gawk '/be+t/{print $0}'

 

2.3 花括号

花括号容许你可重复的正则表达式指定一个上限。这一般成为间隔,能够用两种格式来指定区间。 

m:正则表达式准确出现m次。

m,n:正则表达式至少出现m次,至多n次。

echo "bt" | gawk --re-interval '/b[ae]{1,2}t/{print $0}'

echo "bat" | gawk --re-interval '/b[ae]{1,2}t/{print $0}'

echo "bet" | gawk --re-interval '/b[ae]{1,2}t/{print $0}'

 

2.4 管道符号

就是linux里的|符号,同样的管道。应该是逻辑或的感受

echo "The cat is asleep" | gawk '/cat|dog/{print $0}'
The cat is asleep
echo "The dog is asleep" | gawk '/cat|dog/{print $0}'
The dog is asleep
echo "The sheep is asleep" | gawk '/cat|dog/{print $0}'

 

2.5 表达式分组 

使用园括号进行分组,当你将正则表达式模式分组时,该组会被视为一个标准字符。

echo "Sat" | gawk '/Sat(urday)?/{print $0}'
Sat
echo "Saturday" | gawk '/Sat(urday)?/{print $0}'

echo "cat" | gawk '/(c|b)a(b|t)/{print $0}'
cat
echo "cab" | gawk '/(c|b)a(b|t)/{print $0}'
cab
echo "bat" | gawk '/(c|b)a(b|t)/{print $0}'
bat
echo "bab" | gawk '/(c|b)a(b|t)/{print $0}'
bab
echo "tab" | gawk '/(c|b)a(b|t)/{print $0}'

echo "tac" | gawk '/(c|b)a(b|t)/{print $0}'
相关文章
相关标签/搜索