您的位置:首页 > 运维架构 > Linux

Linux基础 正则表达式

2018-03-27 17:37 211 查看
正则表达式
注意语系对正则表达式的影响 export LANG=
C    :0123...ABCD....Zabcd...z
zh_CN:0123...aAbBcCdDeEfF...zZ

引用的时候得加一个[]  例:[[:alnum:]] 
[:alnum:] 0-9 A-Z a-z
[:alpha:] A-Z a-z
[:digit:] 0-9
[:lower:] a-z
[:upper:] A-Z
[:xdigit:] 十六进制 0-9 A-F a-f

[:blank:] 空格和Tab
[:graph:] 除了空格和Tab
[:space:] 任何会产生空格的字符 包括空格 tab CR
[:cntrl:] 代表键盘上面的控制按键,包括CR LF TAB DEL

[:print:] 任何可以被打印除出来的字符
[:punct:] 标点符号 ' " ? ! : ; # $

grep -n -v -A(num) -B(num) --color=auto ''file     
-n显示行数  -A(after 默认10行) -B(before 默认10行)-v反向选择   --color标出匹配字符
dmesg 列出内核信息
alias grep='grep --color=auto'  可以写在~/.bashrc中 开机自动运行
source 执行
wget url 下载

[]  只表示一个字符,例如[123] 匹配1或2或3 ,匹配字符串"123"
[^] 反向选择 例 '[^g]oo' 匹配前面不是g的oo字符串
#[0-9]=[0123456789]=[:digit:]  注意语系LANG

^ 行首 "^[0-9]" 任意数字开头字符串 ='^[[:digit:]]' 
$ 行尾 "[0-9]$" 任意数字结尾字符串
#'^$'匹配空白行   注意断行符linux($)和windows(^M$)  cat -A filename可以查看

\ 转义有特殊含义的字符
. 有一个任意字符的意思 
* 重复前一个字符0-∞次  o* 匹配0-∞个o字符串 , oo* 至少一个o,   ooo*  至少两个o
#.与*经常组合  .*表示任意字符串

{} 限定连续字符范围(shell中有特殊含义,需要转义字符\{ \})
# 'ooo'='o\{3\}', 匹配2-5个o组成的字符串 'o\{2,5\}' ,匹配2个以上的o 'o\{2,\}'='ooo*']

扩展正则表达式(egrep=grep -E)
+ 重复一个或一个以上的前一个RE字符,egrep -n 'go+d' filename   = grep -n 'goo*d' filename
? 零个或一个的前一个 RE字符    'go?d' 查找gd or god           goo?d=gro\{1,2\}d
| 或(or) egrep -n 'god|good' filename 查找 god or good
() 找出“组”字符串  egrep -n 'g(al|oo)d' filename  查找gald or good   ,所以 g(oo|o)d=goo?d=
()+ 多个重复组的判别 字符串AxzyxzyxzyxzyD匹配方式grep 'A(xzy)+D'

#sed工具
-n 使用安静模式(silent)。一般sed用法,所来来自STDIN的信息显示在屏幕上。加上-n后只显示经过处理的行
-e 选项允许在同一行里执行多条命令: sed -e '1,5d' -e 's/test/check/' file
-f 直接将sed动作写在一个文件内,-f filename执行文件内容
-r sed支持扩展正则表达式,默认基础正则表达式
-i 修改文件内容

[x[,y]] function 动作,x y表示行数
function参数
a 新增  sed '2a oldboy'加在第二行下面
i 插入  sed '2i oldboy'加在第二行上面
#sed '2a oldboy \               \ 多行需要
oldgirl' filename 加两行

c 替换行  sed '2,5c oldboy'  替换2-5行替换成oldboy (4行变1行)
d 删除行  sed '2,5d'filename 删除2-5行 $表示最后一行
p 打印行  配合-n使用,只显示打印内容。不用-n,则原文件内容+打印内容
s 替换 正则表达式 's///'替换第一处  's///g'替换每一次   's///2g'第二处开始替换  

#sed '/(组1)(组2)/\1 \2/'  \1表示组1 \2表示组2
交换第一列和最后一列分隔符':' root:x:0:0:root:/root:/bin/bash
sed -r 's#([a-z]*)(:.*:)(/.*)#\3\2\1#g' filename

#printf 格式化输出(C)
\n 输出新的一行
\f 清屏输出
\a 警告声音输出
\t 水平tab
\v 垂直tab
\b 退格键
\r Enter
printf '%ns %ni %N.nf'   N n表示数字长度  s(string)字符 i(integer)整形 f(floating)浮点
'\x45' ASCII值为45

#awk '条件类型1{动作1}条件2{动作2}' filename   默认的分隔符 空格或tab
awk '{print $n}' fliename    $NF最后一行
FS目前的分隔符  NF拥有字段总数  NR现在处理的是第几行  
例awk 'BEGIN {FS=":"} $3<10 {print $1 "\t" $3}'
-F '[/:]'多个分割符   -F ''无分割符

例题:
找出/etc/下文件类型为连接文件属性的文件。

用正则表达式匹配ifconfig中本机ip     

stat filename提取权限数字

1:过滤出下面正确的手机号
13838389438
23838389438
13535351335
138389438
13122024369
535351335
18920119988

2:过滤出下面正确的邮箱
12121212@qq.com
23232323@.com
@qw23232.163.com
15523153099@139.com
admin@qstack.com.cn
www.qstack.com.cn
qw23232.163.com@qq

3:过滤出正确的出生日期
1900/12/12
2020/15/20
1010/11/60
1995/06/08
1994/01/21
1990/11/11
3990/09/10

4:格式转换
原始数据:
17/Apr/2015:09:29:24 +0800
17/Apr/2015:09:30:26 +0800
17/Apr/2015:09:31:56 +0800
18/Apr/2015:09:34:12 +0800
18/Apr/2015:09:35:23 +0800
19/Apr/2015:09:23:34 +0800
19/Apr/2015:09:22:21 +0800
20/Apr/2015:09:45:22 +0800
转换结果:
2015-04-17 09:29:24+0800
2015-04-17 09:30:26+0800
2015-04-17 09:31:56+0800
2015-04-18 09:34:12+0800
2015-04-18 09:35:23+0800
2015-04-19 09:23:34+0800
2015-04-19 09:22:21+0800
2015-04-20 09:45:22+0800
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: