正则表达式基础
基本语法
- 选择
|竖直分隔符表示选择,例如boy|girl可以匹配boy或者girl - 数量限定
- 若在一个模式中不加数量限定符则表示出现一次且仅出现一次
+表示前面的字符必须出现至少一次(1 次或多次),例如goo+gle可以匹配gooogle,goooogle等?表示前面的字符最多出现一次(0 次或 1 次),例如,colou?r,可以匹配color或者colour
-*星号代表前面的字符可以不出现,也可以出现一次或者多次(0 次、或 1 次、或多次),例如,0*42可以匹配 42、042、0042、00042 等
- 范围和优先级
()圆括号可以用来定义模式字符串的范围和优先级,这可以简单的理解为是否将括号内的模式串作为一个整体- 示例1:
gr(a|e)y等价于gray|grey - 示例2:
(grand)?father匹配father和grandfather
- 部分语法
字符 描述 \将下一个字符标记为一个特殊字符、或一个原义字符。 例如 n匹配字符n。\n匹配一个换行符。序列\\匹配\而\(则匹配(。^匹配输入字符串的开始位置。 $匹配输入字符串的结束位置。 {n}n 是一个非负整数。匹配确定的 n 次。例如 o{2}不能匹配Bob中的o,但是能匹配food中的两个o。{n,}n 是一个非负整数。至少匹配 n 次。例如 o{2,}不能匹配Bob中的o,但能匹配foooood中的所有o。o{1,}等价于o+。o{0,}则等价于o*。{n,m}m 和 n 均为非负整数,其中 n<=m。最少匹配 n 次且最多匹配 m 次。例如,o{1,3}将匹配fooooood中的前三个o。o{0,1}等价于o?。请注意在逗号和两个数之间不能有空格。*匹配前面的子表达式零次或多次。例如, zo*能匹配z、zo以及zoo。*等价于{0,}。+匹配前面的子表达式一次或多次。例如, zo+能匹配zo以及zoo,但不能匹配z。+等价于{1,}。?匹配前面的子表达式零次或一次。例如, do(es)?可以匹配do或does中的do。?等价于{0,1}。?当该字符紧跟在任何一个其他限制符( *,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串oooo,o+?将匹配单个o,而o+将匹配所有o。.匹配除 \n之外的任何单个字符。要匹配包括\n在内的任何字符,请使用类似(.|\n)的模式。(pattern)匹配 pattern 并获取这一匹配的子字符串。该子字符串用于向后引用。要匹配圆括号字符,请使用 \(和\)。x | y 匹配 x 或 y。例如,“z | food”能匹配 z或food。“(z | f)ood”则匹配zood或food。[xyz]字符集合(character class)。匹配所包含的任意一个字符。例如, [abc]可以匹配plain中的a。其中特殊字符仅有反斜线\保持特殊含义,用于转义字符。其它特殊字符如星号、加号、各种括号等均作为普通字符。脱字符^如果出现在首位则表示负值字符集合;如果出现在字符串中间就仅作为普通字符。连字符-如果出现在字符串中间表示字符范围描述;如果出现在首位则仅作为普通字符。[^xyz]排除型(negate)字符集合。**匹配未列出的任意字符。**例如, [^abc]可以匹配plain中的plin。[a-z]字符范围。**匹配指定范围内的任意字符。**例如, [a-z]可以匹配a到z范围内的任意小写字母字符。[^a-z]排除型的字符范围。匹配任何不在指定范围内的任意字符。例如, [^a-z]可以匹配任何不在a到z范围内的任意字符。 - 优先级
优先级从上到下,从左到右依次降低运算符 说明 \转义符 (),(?:),(?=),[]括号和中括号 *,+,?,{n},{n,},{n,m}限定符 ^,$,\任何元字符定位点和序列 | 选择
grep模式匹配命令
- 基本操作
grep命令用于打印输出文本中匹配的模式串,它使用正则表达式作为模式匹配的条件- 支持单中正则表达式引擎:
参数 说明 -EPOSIX 扩展正则表达式,ERE -GPOSIX 基本正则表达式,BRE -PPerl 正则表达式,PCRE - 常用参数
参数 说明 -b将二进制文件作为文本来进行匹配 -c统计以模式匹配的数目 -i忽略大小写 -n显示匹配文本所在行的行号 -v反选,输出不匹配行的内容 -r递归匹配查找 -A nn 为正整数,表示 after 的意思,除了列出匹配行之外,还列出后面的 n 行 -B nn 为正整数,表示 before 的意思,除了列出匹配行之外,还列出前面的 n 行 --color=auto将输出中的匹配项设置为自动颜色显示
- 使用正则表达式
- 使用基本正则表达式,BRE
- 位置
查找/etc/group文件中以shiyanlou为开头的行grep 'shiyanlou' /etc/group grep '^shiyanlou' /etc/group - 数量
# 将匹配以'z'开头以'o'结尾的所有字符串 echo 'zero\nzo\nzoo' | grep 'z.*o' # 将匹配以'z'开头以'o'结尾,中间包含一个任意字符的字符串 echo 'zero\nzo\nzoo' | grep 'z.o' # 将匹配以'z'开头,以任意多个'o'结尾的字符串 echo 'zero\nzo\nzoo' | grep 'zo*' - 选择
# grep默认是区分大小写的,这里将匹配所有的小写字母 echo '1234\nabcd' | grep '[a-z]' # 将匹配所有的数字 echo '1234\nabcd' | grep '[0-9]' # 将匹配所有的数字 echo '1234\nabcd' | grep '[[:digit:]]' # 将匹配所有的小写字母 echo '1234\nabcd' | grep '[[:lower:]]' # 将匹配所有的大写字母 echo '1234\nabcd' | grep '[[:upper:]]' # 将匹配所有的字母和数字,包括0-9,a-z,A-Z echo '1234\nabcd' | grep '[[:alnum:]]' # 将匹配所有的字母 echo '1234\nabcd' | grep '[[:alpha:]]' - 特殊符号及说明:
特殊符号 说明 [:alnum:]代表英文大小写字母及数字,亦即 0-9,A-Z,a-z [:alpha:]代表任何英文大小写字母,亦即 A-Z,a-z [:blank:]代表空白键与 [Tab]按键两者[:cntrl:]代表键盘上面的控制按键,亦即包括 CR,LF,Tab,Del... [:digit:]代表数字而已,亦即 0-9 [:graph:]除了空白字节(空白键与 [Tab] 按键)外的其他所有按键 [:lower:]代表小写字母,亦即 a-z [:print:]代表任何可以被列印出来的字符 [:punct:]代表标点符号(punctuation symbol),即: ",',?,!,;,:,#,$...[:upper:]代表大写字母,亦即 A-Z [:space:]任何会产生空白的字符,包括空格键, [Tab],CR 等等[:xdigit:]代表 16 进位的数字类型,因此包括: 0-9,A-F,a-f 的数字与字节 - 排除字符
echo 'geek\ngood' | grep '[^o]'当 ^ 放到中括号内为排除字符,否则表示行首。
- 位置
- 使用扩展正则表达式,ERE
- 要通过
grep使用扩展正则表达式需要加上-E参数,或使用egrep - 数量
# 只匹配"zo" echo 'zero\nzo\nzoo' | grep -E 'zo{1}' # 匹配以"zo"开头的所有单词 echo 'zero\nzo\nzoo' | grep -E 'zo{1,}' - 选择
# 匹配"www.shiyanlou.com"和"www.google.com" echo 'www.shiyanlou.com\nwww.baidu.com\nwww.google.com' | grep -E 'www\.(shiyanlou|google)\.com' # 或者匹配不包含"baidu"的内容 echo 'www.shiyanlou.com\nwww.baidu.com\nwww.google.com' | grep -Ev 'www\.baidu\.com'
- 要通过
- 使用基本正则表达式,BRE
sed流编辑器
- 基本格式
sed [参数]... [执行命令] [输入文件]... # 形如: $ sed -i 's/sad/happy/' test # 表示将test文件中的"sad"替换为"happy" - 常用参数
参数 说明 -n安静模式,只打印受影响的行,默认打印输入数据的全部内容 -e用于在脚本中添加多个执行命令一次执行,在命令行中执行多个命令通常不需要加该参数 -f filename指定执行 filename 文件中的命令 -r使用扩展正则表达式,默认为标准正则表达式 -i将直接修改输入文件内容,而不是打印到标准输出设备 - sed编辑器的执行命令
- 执行命令格式
[n1][,n2]command [n1][~step]command- 其中
n1,n2表示输入内容的行号,它们之间为,逗号则表示从 n1 到 n2 行,如果为~波浪号则表示从 n1 开始以 step 为步进的所有行;command 为执行动作 - 其中一些命令可以在后面加上作用范围
sed -i 's/sad/happy/g' test # g 表示全局范围 sed -i 's/sad/happy/4' test # 4 表示指定行中的第四个匹配字符串- 常用动作指令:
| 命令 | 说明 |
| ---- | ------------------------------------ |
|s| 行内替换 |
|c| 整行替换 |
|a| 插入到指定行的后面 |
|i| 插入到指定行的前面 |
|p| 打印指定行,通常与-n参数配合使用 |
|d| 删除指定行 |
awk文本处理语言
- 介绍
AWK 是一种优良的文本处理工具,Linux 及 Unix 环境中现有的功能最强大的数据处理引擎之一。
- 基本概念
- awk 所有的操作都是基于 pattern(模式)—action(动作)对来完成
在一个完整 awk 操作中,这两者可以只有其中一个,如果没有 pattern 则默认匹配输入的全部文本,如果没有 action 则默认为打印匹配内容到屏幕pattern {action} - awk命令基本格式
awk [-F fs] [-v var=value] [-f prog-file | 'program text'] [file...]其中
-F参数用于预先指定前面提到的字段分隔符(还有其他指定字段的方式),-v用于预先为awk程序指定变量,-f参数用于指定awk命令要执行的程序文件,或者在不加-f参数的情况下直接将程序语句放在这里,最后为awk需要处理的文本输入,且可以同时输入多个文本文件。 - 示例
vim test #内容 #I like linux #www.shiyanlou.com shiyanlou:~/ $ awk '{ quote> if(NR==1){ quote> print $1 " " $2 " " $3 quote> } else { quote> print} quote> }' test I like linux www.shiyanlou.com - awk常用的内置变量
变量名 说明 FILENAME当前输入文件名,若有多个文件,则只表示第一个。如果输入是来自标准输入,则为空字符串 $0当前记录的内容 $NN 表示字段号,最大值为 NF变量的值FS字段分隔符,由正则表达式表示,默认为空格 RS输入记录分隔符,默认为 \n,即一行为一个记录NF当前记录字段数 NR已经读入的记录数 FNR当前输入文件的记录数,请注意它与 NR 的区别 OFS输出字段分隔符,默认为空格 ORS输出记录分隔符,默认为 \n