正则表达式
文章介绍是使用文件: /etc/passwd
/etc/passwd存放用户信息,由6个冒号组成7个信息
- 用户名
- 密码(x表示加密密码)
- UID(用户标识)
- GID(组标识)
- 用户全名或本地账号
- 家目录
- 登录之后使用的终端命令 主要内容
正则表达式
grep 'a' passwd
范围字符
grep '[0-9]' password
grep '[259]' password
grep '[a-z]'password
grep '[A-Z]' password
grep '[a-zA-Z]' password
grep '[,:/]' password
^反向字符
范围取反[^0-9],[^0] # '.' 代表任意字符 ,'[.]' 和 '\.'代表实际的点
开头'^'
grep '^root' passwd
结尾'$'
grep 'false$' passwd
空行的表示
'^$'
元字符(代表普通字符或特殊字符)
grep '\W' passwd
grep '\w' passwd
grep '\bx\b' passwd #单词分割字符
字符组合
grep 'se*' passwd #结果 sesesese 、se、seeeeeeeee、sooooo、se+se+se
grep 'se\+' passwd #必须加\ 不加的话就是代表字符串"se+". 结果是sesesese、se、seeeeeee、+se+se+
grep 'se\? passwd' #结果为sesesesese、se、s
重复特定次数
grep '[0-9]\{2,3\}' passwd #匹配两位或三位字符
案例一 匹配4-10位的qq号
grep '^[0-9]\{4,10\}$' passwd
案例二 匹配15位或18位身份证号(支持带X的)
grep '^[1-9]\([0-9]\{13\}\|[0-9]\{16\}\)[0-9xX]$' passwd
案例三 匹配密码(由数字、26个字母和下划线组成)
grep '\w\+$' passwd
正则表达式总结
grep
常用参数说明
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN]... [-f FILE]... [FILE...]
OPTIONS:
-e: 使用正则搜索, 注意:{}等一些特殊符号需要进行转义. 即使用\{\}
-i: 不区分大小写
-v: 查找不包含指定内容的行
-w: 按单词搜索
-c: 统计匹配到的次数
-n: 显示行号
-r: 逐层遍历目录查找
-A: 显示匹配行及后面多少行, 如: -A3, 则表示显示匹配行及后3行
-B: 显示匹配行及前面多少行, 如: -B3, 则表示显示匹配行及前3行
-C: 显示匹配行前后多少行, 如: -C3, 则表示显示批量行前后3行
-E: 扩展的正则表达式. 使用该参数时不用加转义符\, 如可以直接使用[a-z]{5}
--color: 匹配到的内容高亮显示
--include: 指定匹配的文件类型
--exclude: 过滤不需要匹配的文件类型
grep -n -B3 --color '[0-9]\{5\}' passwd
grep常见用法
#多文件查询
grep 11 passwd testfile
#查找即包含leo又包含li的行
grep leo logs.log | grep li
#可以不使用转义符
egrep -n -B3 --color '[0-9]{5}' passwd
#查找空行
grep ^$ logs.log
#查找第一个匹配的行
grep -n -m3 --color '1' passwd
#查找最后一个匹配的行
grep leo logs.log | awk 'END{print $0}'
sed -n '/leo/h;${g;p}' logs.log
awk '/leo/{} END{print}' logs.log
sed使用
常见用法
- 自动处理文件
- 分析日志文件
- 修改配置文件 sed是如何进行文本处理的? sed被称为流处理编辑器
sed先通过通过正则选定文本,然后调用sed命令进行处理
sed 参数 命令 input_file
-p 打印相关行
sed 'p' passwd #注意这样每一行会被输出两次 使用p打印时必须加参数-n
sed -n 'p' passwd #正确使用
sed行定位
sed -n '10p' passwd #打印第10行
nl passwd | sed -n '10p'
nl passwd | sed -n '10,20p' #打印第10到20行
通过正则定位,两边要加 / 用来区分
sed -n '/apache/p' passwd #打印匹配行
nl passwd | sed -n '/root/,/apache/p' 打印root到apache的匹配行
nl passwd | sed -n '1,17p'
nl passwd | sed -n '10!p' #不选择第十行
定位间隔几行: first~step
nl passwd | sed -n '1~2p' #间隔行的定位
基本操作命令
nl passwd | sed '5a -------------------------' #在第五行后面增加------------------
nl passwd | sed '1,5a -------------------------' #在第一到五行每一行后都增加--------------------
nl passwd | sed '5i -------------------------' #在第五行之前插入---------------------------
nl passwd | sed '1,5i -------------------------' #在第一到五行每一行前都增加--------------------
nl passwd | sed '40c 123456678' #替换第四十行
nl passwd | sed '1,40c 123456678' #1~40行整体替换
nl passwd | sed '/root/d' #删除root行
nl passwd | sed '/root/,/apache/d' # 删除选定行root到apache行
这些sed基本操作命令不会改变原文件
例如 :
1. sed '$a qt101x.corp.youdao.com \n16666 ' passwd #在文件末尾增加host port
sed '$a \ qt101x.corp.youdao.com \n 16666 ' passwd 追加空格
2. 删除空行
sed '/^$/d' passwd
3. 打印出Error日志
sed -n '/Error/p' passwd
sed 's/root/zhansan/' passwd #把root替换成zhansan
sed 's/:/%/' passwd #仅替换每一行的第一个
sed 's/:/%/g' passwd #全局替换
案例:数据筛选
打印系统ip
/sbin/ifconfig bond0
/sbin/ifconfig bond0 | sed -n '/inet /p' #取到目标行 或:/sbin/ifconfig eth0 | sed -n '2p'
/sbin/ifconfig bond0 | sed -n '/inet /p'|sed 's/inet.*r://' #截取前半部分
/sbin/ifconfig bond0 | sed -n '/inet /p'|sed 's/inet.*r://'|sed 's/B.*$//' 截取后半部分 打出结果
-& ∶替换固定字符串
#元字符 \u 首字母小写转换为大写、\U 首个匹配到的字符串全部转换为小写
\l首个字母转换为大写、\L 首个匹配到的字符串全部转换为大写
sed 的参数包括
-n-e-f-r-i
-i:直接修改文档读取内容,不在屏幕上输出
sed -i 's/原字符串/新字符串' /home/xxx.text
awk使用
awk的特点
awk的应用
- 统计
- 制表 awk的处理方式与格式
- awk一次处理一行内容
- awk对每一行可以进行切片处理
awk 内置变量1
- $0 ∶表示整个当前行
- $1 :每行第一个字段
- $2 ︰每行第二个字段 每个字段怎么划分呢
awk 内置参数∶分割符
options : -F field-separator (默认为空格) 例如: awk -F ':'‘{print3y/etc/passwd
awk -F ':' '{print $1}' passwd #打印出每一行的第一个字段 如为$2则打印第二个字段
awk -F ':' '{print $1,$3}' passwd #同时打印第一个字段和第三个字段加逗号表示中间以空格隔开
awk -F ':' '{print "USERID:"$1"\t""UID:"$3}' passwd #中间也可以加一些字符串打印出来
awk 内置变量2
- NR :代表每一行的行号
- NF:代表每一行的字段数 #被分割后
- FILLENAME :每一行的文件名的文件名
awk -F ':' '{print NR, NF, FILENAME}' passwd
awk练习 print ,printf的使用
awk -F ':' '{print "Line: " NR, "col: "NF, "User: "$1}' passwd #打印所有个行号 字段数 用户名
awk -F ':' '{printf("Line: %3s Col: %s User: %s\n"),NR,NF,$1}' passwd #使用printf打印
if...else...使用
显示/etc/passwd中用户ID大于100的行号和用户名( if ....else...)
awk -F ':' '{if($3>20) print "Line: "NR, "User: "$1}' passwd #打印用户id>20的 行号 用户名
找出日志中的报错时间
awk '/ERROR/{print $1,$2,$7}' file.log #使用awk命令定位到报错时间以
awk逻辑判断式
awk -F ':' '$1~/^m.*$/{print $1}' passwd #查找到以m开头的第一个字段
awk -F ':' '$1!~/^m.*$/{print $1}' passwd #查找到不以m开头的第一个字段
awk -F ':' '$3>20 {print $1,$3}' passwd #匹配到第三个字段大于20的行
awk -F ':' '$3==20 {print $1,$3}' passwd #匹配到第三个字段等于20 是行
awk扩展格式
BEGIN{ print "start" } pattern{ecommands }END{ print"end" } #BEGIN END 不参与循环
awk -F ':' 'BEGIN{print "Line UID USER"}{print NF" ", $3" ", $1}END{print"-------------------"FILENAME"-------------"}' passwd
带有变量的awk 统计当前文件夹下文件占用的大小
ls -l | awk 'BEGIN{sixe=0}{size+=$5}END{print "size is " size "k"}'
awk 和 sed 比较
- awk和sed都可以处理文本
- awk侧重于复杂逻辑处理
- sed侧重于正则处理
sed与awk也可以共同使用