oldboy Linux:
Linux正则表达式与三剑客
正则表达式是为处理大量的字符串及文本而定义的一套规则和方法。
Linux三剑客的正则表达式特点: 以行为单位进行操作,每一次仅操作一行;可以将复杂的处理任务化繁为简,提高Linux的效率;仅被三剑客命令支持,其他命令无法使用。
1.利用命令ipconfig取出IP地址:ifconfig eth0 | sed -rn '2s#^.*inet(.*)net.*$#\1#gp'
正则表达式易混淆事项:
与通配符区别;与开发人员正则不一样,其一般是Perl兼容正则表达式;Linux系统三剑客正则表达式
环境准备:
执行命令: export LC_ALL=C 配置后操作时不会出现异常匹配情况
正则表达式分类:
基本正则表达式:BRE basic regular expression
对应元字符:^$[].
【 显示行号:cat -n less -N
^ 表以什么开头,比如grep "^cd" 表过滤以cd开头的行
$ 表以什么结尾 比如grep "cd$" 表过滤以cd结尾的行
^$ 表空白 比如:grep -v "^$"表过滤空白取出没有空白的行(-v表取反,-n列出行号)
. 表匹配任意一个且只有一个字符,与通配符?效果一样。
\ 让有意义的字符脱掉马甲,还原本意。 grep "\.$"表以.结尾的行而不是任意一个字符结尾
* 表重复前面字符0次或多次
.* 表所有内容 grep -n ".*"表显示所有内容并打印行号
^.* 匹配任意字符开头的行
.*$ 匹配任意字符结尾的行
[abc] 匹配abc任意字符亦可写成[a-c]
[^abc] 匹配不包含abc任意字符的行,^表取反
】
扩展正则表达式:ERE extended regular expression
对应元字符:(){}?+| egrep=grep -E
【-o 可深刻理解
+ 匹配一个字符或1次以上多次
[:/]+ 匹配括号内的:或\字符一次或1次以上
? 匹配前一个字符0次或1次
| 表 或者 的意思,可同时过滤多个字符串 比如:egrep "a|b" 过滤匹配到a或者b字符的行
a{n,m} 匹配前一个字符最少n次最多m次
a{n,} 匹配前一个字符最少n次
a{n} 匹配前一个字符正好n次
a{,m} 匹配前一个字符最多m次
() 表括起来的是一个整体,可被\n应用,后项应用
\n 后项应用,()\n表取出第n个括号里的内容 (0)(0)\1\2等价于0000 (0)等价于\1
】
预定义特殊中括号表达式:正则表达式中已经定义好了的,可以直接使用中括号表达式
[:alnum:] 任意匹配一个字母或者数字相当于[a-zA-Z0-9] 示例:[[:alnum:]]
[:alpha:] 匹配任意一个大小写字母字符相当于[a-zA-Z] 示例: [[:alpha:]]
[:blank:] 匹配空格与制表符(横向和纵向) 示例: [[:blank:]]
[:digit:] 匹配任意一个数字字符相当于[0-9] 示例: [[:digit:]]
[:lower:] 匹配小写字母 相当于[a-z] 示例:[[:lower:]]
[:upper:] 匹配大写字母 相当于[A-Z] 示例:[[:upper:]]
[:punct:] 匹配标点符号 示例:[[:punct:]]
[:space:] 匹配一个包括换行符回车等在内的所有空白字符 示例: [[:space:]]
[:graph:] 匹配任意一个可以看得见的且可以打印的字符 示例: [[:graph:]]
[:xdigit:] 任意一个16进制数即[0-9,a-f,A-F] 示例:[[:xdigit:]]
[:cntrl:] 任意一个控制字符(ASCII字符集中前32个字符) 示例: [[:cntrl:]]
[:print:] 任何一个可以打印的字符 示例:[[:print:]]
元字符表达式介绍:是一种Perl风格的正则表达式
\b 匹配单词边界等价于grep-w 例如:\boldboy\b 只匹配oldboy单词不匹配oldboy字符串
\B 匹配非单词边界 例如:oldboy\B 匹配oldboy123中的oldboy不匹配单独的oldboy单词
\w 匹配字母,数字,下划线等价于[[:alnum:]]
\W 匹配字母数字下划线以外的字符等价于[^_[:alnum:]]
\d 匹配单个数字字符,需要使用grep -P才能识别
\D 匹配单个非数字字符,需要使用grep -P才能识别
\s 匹配1位空白字符 ,需要使用grep -P才能识别
\S 匹配1位非空白字符,需要使用grep -P才能识别
二。三剑客
grep:擅长过滤查找内容 筛子
-v : invert取反; -i: ignore不区分大小写;
-n: number对输出的内容显示源文件 的行号 -w: word按单词为单位过滤
-o: 只输出匹配的内容 -c:显示过滤的字符串和它之间之后的多少行
sed: 流编辑器 擅长取行,替换,删除,追加
功能说明: sed是操作,过滤和转换文本内容的强大工具,对文件实现增删改查。过滤指定字符串和行
语法格式: sed 选项 sed内置命令字符 输入文件
选项: -n: 取消默认sed输出,常与sed内置命令p连用
-i: 直接修改文件内容,而不是输出终端。不加则是修改内存中的数据并不会影响磁盘的文件
-e: 允许多次编辑
内置命令符:
s: 替换
g: global全局替换
a: append表追加文本,在指定行后面添加一行或多行。
d: delete表示删除匹配行
i: insert表插入文本,在指定行前插入一行
p: print表示打印匹配行的内容,通常与-n连用
例子:
1.打印二三行 sed -n '2,3p' file
2.过滤含有old字符串的行 sed -n '/old/p' file
3.删除含有old字符串的行 sed '/old/d' file
4.将old字符串替换new sed 's#想替换啥#有啥替换#g' file (vim中替换:s%/old/new/g)
5.在file文件第二行追加文本 sed '2a Linux like linux' file (插入多行可linux\apache\zabbix)
6.ifconfig eth0|sed -n 2p | sed 's#^.*inet ##g' | sed 's# netm.*$##g' 优化 ifconfig eth0|sed -ne 's#^.*inet ##g' -e 's# netm.*$##gp' 优化 ifconfig etho | sed -nr '2s#^.*inet (.*) netm.*$#\1#gp'
7.
三剑客老大: awk 是一种编程语言 擅长取列 【cut按列切割,-d指定切割符,-f指定列,多列用,分开,或者n-m】
语法: awk 参数 '条件 {动作}'
参数: -F 指定分隔符
动作: 列:$1 打印第一列 ;$2 第二列 ; $0 整行; $NF最后一列; $(NF-1)倒数第二列;$NR 行号
例子: awk 'NR>1&&NR<4' file 输出第二和第三行内容
awk '/^[^r]/' file 输出非root的行
awk '/root/' file 输出含有root的行
awk -F ":" {print NR,$1,$3,$NF}' file 打印1,3和最后一行并显示行号。
echo 1:-::2==-==::==3==:::==4==:::| awk -F "[:=-]+" '{print $3,$4}' 结果为:3和4 【 [:=-]+ 一堆分割符算一个】
echo ==::--1:-::2==-==::==3==:::==4==:::| awk -F "[:=-]+" '{print $3,$4}' 结果为 2和3
awk -F ":" '$1~/root/ {print $NF}' file 过滤文件中第一行内容匹配root的字符串,把符合的行的最后一列输出 【~表匹配】