(CN) Data Wrangling
数据整理
一 基础正则表达式
-
匹配有规律的东西:手机号,身份证
-
grep ’ '
-
^
以……开头的行$
以……结尾的行 -
^$
表示空行 -
grep -n '^$' file
显示空行和行号排除空行:
grep -v '^$' filename
-
.
注意其不匹配空行 -
\.
转义字符grep '\.$' oldboy.txt
匹配以点结尾的行 -
*
前一个字符连续出现0次或者0次以上grep '0*' oldboy.txt
-
.*
所有内容,任意内容 注意其可以匹配出空行 -
-
正则表达式的贪婪性:
-
多匹配内容的灵异:
2*
数字2出现了0次或者0次以上出现0次相当于空,所有也就会匹配出文件所有内容
-
[]
e.g.[abc]
一次匹配一个字符,匹配任何一个字符(a,b或者c)grep -o '[abc]' filename
显示过程[a-z] [A-Z] [0-9]
[a-z | A-Z ] 中间出现的
|
和space
都没用特殊含义 -
匹配文件中的大小写字母和数学 [a-zA-Z]
grep '[a-zA-Z0-9]' filename
grep -i......
不区分大小写 -
[^abc]
排除a,b,c的内容 -
总结
基础正则 | 含义 | 搭配 |
---|---|---|
^ | 以xxx开头 | |
$ | 以xxx结尾 | |
^$ |
空行 | ^$ |
. | 任意一个字符 | |
* | 前一个字符连续出现0次或以上 | |
.* | 所有 | .* |
\ | 转义 | |
[] | 一个整体,匹配任意一个字符 | []与+ |
[^] | 取反 |
二 扩展正则
符号 |
---|
+ |
| |
() |
{} |
? |
-
+
出现1次或者1次以上:egrep '0+' oldboy.tx
extended grepgrep -E sed -r
扩展正则 -
|
或者 -
[] 与 |
[] 一次匹配一个字符 匹配单个字符
| 匹配一个字符或多个 匹配整个单词的时候
-
()
表示一个整体,括起来的内容 反向应用(sed) -
{}
连续出现o{n,m}
前一个字母o,至少连续出现n次,最多连续出现m次o{n}
o出现n次o{n,}
前一个字母o,至少连续出现n次o{,m}
前一个字母o,最多连续出现m次 -
?
连续出现 前一个字符出现了0次或1次 -
-
[]+ 连续出现
三 三剑客简介
-
命令 特点 场景 grep 过滤 过滤速度最快 sed 替换,修改文件内容,取行 替换或者就修改文件内容,取出某个范围的内容 awk 取列,统计计算 取列,对比比较,统计计算(awk数组)
四 grep
-
选项 含义 -E ==egrep 支持拓展正则 -A after 匹配你要的内容显示接下来的五行 -B before -C context 上下五行 -v 取反 -c count -w 精确匹配
五 sed stream editor 一行一行处理文件
-
sed -r 's#oldboy#oldgirl#g' oldboy.txt
——s表示替 换
-
功能 增删改查 s substitute p print d delete 按行 cai 增加 c/a/i -
sed查找 -n 非默认输出
查找格式 功能 ‘1p’ ‘2p’ 指定行号进行查找 ‘1,5p’ 指定行号范围进行查找 ‘/xxxxx/p’ 类似于grep //之间可以写正则 ‘/10:00/,/11:00/p’ 一段范围内的查找 ==如果结尾找不到,就会默认找到文件结尾== -
$ 表示文件最后一行
-
sed -n '/11:02:30/p' access.log
-
从第一行找到yy结束,为混合用法
-
删除 d
-
!妙用
取反sed -nr '/^$|#/!p' filename
!p表示不删除 -
增加
命令 c replace 替换行的内容 a append 追加(后面),向指定的行或者每行插入内容 i insert向指定的行或者每行插入内容,在前面 -
-
替换
g
global 全局替换替换格式 s###g s@@@g -
-
后向引用:先保护后使用
六 awk
-
awk -F, 'BEGIN{print "name"}{print $2}END{print "end of file"}'
-
BEGIN{print “name”} 读取文件之前
{print $2} 读取文件的时候
END{print “end of file”} 读完文件之后
-
名词 awk叫法 说明 行 record 记录 回车分割行 列 field字段 默认通过空格分割 -
取行
-
awk内置变量
awk 说明 NR==1 取出某一行 NR>=1&&NR<=5 取出一到五行 /oldboy/ /101/,/105/ 类似于sed NR number of record NF $NF
最后一列number of field FS -F: == -v FS=: field separator字段分割符 OFS output field separator 输出字段分割符 [root@Outis threetools]# awk -F: -v OFS=: '{print $NF,$2,$3}' /etc/passwd /bin/bash:x:0 /sbin/nologin:x:1 /sbin/nologin:x:2 /sbin/nologin:x:3 /sbin/nologin:x:4 /bin/sync:x:5 /sbin/shutdown:x:6
-
取列
-F
指定每一列结束标记的分割符(默认是空格,连续的空格,制表符tab)$1
取出第一列$0
整行的内容 -
取出第一列和最后一列
awk -F: '{print $1,$NF}' filename
-
综合案例:
[root@Outis threetools]# ip a s eth0 | awk -F"[ /]+" 'NR==3{print $2}' inet ip a s eth0 | awk -F"[ /]+" 'NR==3{print $3}' 172.22.134.87
-
awk模式匹配
比较符号:><= !=
正则
范围表达式
特殊条件:BEGIN 和 END
-
akw的正则:
/xxx/ 支持正则
~ 包含
!~不包含
基础正则 akw正则 ^ 某一列开头 $3~/^oldboy/ $ 某一列结尾 ^$ 某一列为空 [root@Outis threetools]# awk -F: '$3~/^2/{print $1,$3,$NF}' /etc/passwd # 第三列 以2开头的列 打印出第一列 第三列 和最后一列 daemon 2 /sbin/nologin nscd 28 /sbin/nologin mysql 27 /bin/false
-
范围表示
/xxx/,/xxx/{print $1}
NR==1,NR==5
类似于sed -n '1,5p'
-
特殊条件 :
模式 含义 应用场景 BEGIN{} 在awk读取文件之前执行 (1)进行简单的统计,计算,不涉及读取文件
(2)处理文件之前,添加表头END{} 在awk读取文件之后执行 (1)awk进行统计,先进行计算,最后END里输出结果
(2)awk数组,来输出数组的结果# 统计 /etc/service 里面有多少个空行 [root@Outis threetools]# awk '/^$/{i++}END{print i}' /etc/services 17
-
awk数组
awk 'BEGIN{a[0]="oldboy";a[1]="lidao";print a[0],a[1]}' # awk中字母会被识别成变量,需要双引号括起来才行 for(i in array) # print i 变量获取到的是数组的下标 print array[i] #这样即可
-
案例:
# 统计出现次数 [root@Outis threetools]# cat url.txt http://www.etiantian.org/index.html http://www.etiantian.org/1.html http://post.etiantian.org/index.htm1 http://mp3.etiantian.org/index.html http://www.etiantian.org/3.html http://post.etiantian.org/2.html [root@Outis threetools]# awk -F"[/.]+" '{print $2}' url.txt www www post mp3 www post [root@Outis threetools]# awk -F"[/.]+" '{array[$2]++}' url.txt awk -F"[/.]+" '{array[$2]++}END{for(i in array)print i,array[i]}' url.txt www 3 mp3 1 post 2
-
awk 循环与判断
for(i=1;i<=10;i++) print i
if(a=1) print "hello world ! "
-
案例:
# for 和 if 的混合使用 [root@Outis threetools]# echo I am oldboy teacher welcome to oldboy training class.|awk '{for(i=1;i<NF;i++)print $i}' I am oldboy teacher welcome to oldboy training [root@Outis threetools]# echo I am oldboy teacher welcome to oldboy training class.|awk -F"[ .]+" '{for(i=1;i<NF;i++)print $i}' I am oldboy teacher welcome to oldboy training class # length()函数显示字数 [root@Outis threetools]# echo oldboy | awk '{print length()}' 6 [root@Outis threetools]# echo I am oldboy teacher welcome to oldboy training class.|awk -F"[ .]+" '{for(i=1;i<NF;i++)if(length($i)<6)print $i}' I am to class