(CN) Data Wrangling

数据整理

一 基础正则表达式

  1. 匹配有规律的东西:手机号,身份证

  2. grep ’ '

  3. ^以……开头的行

    image-20220111203315452

    $以……结尾的行

    image-20220111203422382

  4. ^$表示空行

  5. grep -n '^$' file 显示空行和行号

    排除空行:grep -v '^$' filename

  6. . 注意其不匹配空行

    image-20220111204226092

  7. \. 转义字符grep '\.$' oldboy.txt 匹配以点结尾的行

  8. *前一个字符连续出现0次或者0次以上 grep '0*' oldboy.txt

  9. .*所有内容,任意内容 注意其可以匹配出空行

  10. image-20220111205132375

  11. 正则表达式的贪婪性:

    image-20220111205311029

  12. 多匹配内容的灵异:

    2* 数字2出现了0次或者0次以上

    出现0次相当于,所有也就会匹配出文件所有内容

  13. [] e.g.[abc] 一次匹配一个字符,匹配任何一个字符(a,b或者c)

    image-20220111215505241

    grep -o '[abc]' filename 显示过程

    [a-z] [A-Z] [0-9]

    [a-z | A-Z ] 中间出现的|space都没用特殊含义

  14. 匹配文件中的大小写字母和数学 [a-zA-Z]

    grep '[a-zA-Z0-9]' filename

    grep -i...... 不区分大小写

  15. [^abc] 排除a,b,c的内容

  16. 总结

基础正则 含义 搭配
^ 以xxx开头
$ 以xxx结尾
^$ 空行 ^$
. 任意一个字符
* 前一个字符连续出现0次或以上
.* 所有 .*
\ 转义
[] 一个整体,匹配任意一个字符 []与+
[^] 取反

二 扩展正则

符号
+
|
()
{}
?
  1. + 出现1次或者1次以上:

    egrep '0+' oldboy.tx extended grep

    grep -E sed -r 扩展正则

  2. |或者

    image-20220111221535463

  3. [] 与 |

    [] 一次匹配一个字符 匹配单个字符

    | 匹配一个字符或多个 匹配整个单词的时候

  4. ()表示一个整体,括起来的内容 反向应用(sed)

    image-20220111222049836

  5. {} 连续出现

    o{n,m}前一个字母o,至少连续出现n次,最多连续出现m次

    o{n} o出现n次

    o{n,} 前一个字母o,至少连续出现n次

    o{,m} 前一个字母o,最多连续出现m次

    image-20220111222259343

    image-20220111222400104

  6. 连续出现 前一个字符出现了0次或1次

    image-20220111224736834

  7. image-20220117124329714

  8. []+ 连续出现

三 三剑客简介

  1. 命令 特点 场景
    grep 过滤 过滤速度最快
    sed 替换,修改文件内容,取行 替换或者就修改文件内容,取出某个范围的内容
    awk 取列,统计计算 取列,对比比较,统计计算(awk数组)

四 grep

  1. 选项 含义
    -E ==egrep 支持拓展正则
    -A after 匹配你要的内容显示接下来的五行
    -B before
    -C context 上下五行
    -v 取反
    -c count
    -w 精确匹配

五 sed stream editor 一行一行处理文件

  1. sed -r 's#oldboy#oldgirl#g' oldboy.txt —— s表示替 换

  2. 功能 增删改查
    s substitute
    p print
    d delete 按行
    cai 增加 c/a/i
  3. sed查找 -n 非默认输出

    查找格式 功能
    ‘1p’ ‘2p’ 指定行号进行查找
    ‘1,5p’ 指定行号范围进行查找
    ‘/xxxxx/p’ 类似于grep //之间可以写正则
    ‘/10:00/,/11:00/p’ 一段范围内的查找 ==如果结尾找不到,就会默认找到文件结尾==
  4. image-20220117133120603

    $ 表示文件最后一行

  5. sed -n '/11:02:30/p' access.log

  6. 从第一行找到yy结束,为混合用法

    image-20220117134618294

  7. 删除 d

    image-20220117134827702

    image-20220117134911035

  8. !妙用 取反

    sed -nr '/^$|#/!p' filename !p表示不删除

  9. 增加

    命令
    c replace 替换行的内容
    a append 追加(后面),向指定的行或者每行插入内容
    i insert向指定的行或者每行插入内容,在前面
  10. image-20220117135628451

  11. 替换

    g global 全局替换

    替换格式
    s###g
    s@@@g
  12. image-20220117141259530

  13. 后向引用:先保护后使用

    image-20220117142138368

    image-20220117142445289

    image-20220117143255673

六 awk

  1. awk -F, 'BEGIN{print "name"}{print $2}END{print "end of file"}'

  2. BEGIN{print “name”} 读取文件之前

    {print $2} 读取文件的时候

    END{print “end of file”} 读完文件之后

  3. 名词 awk叫法 说明
    record 记录 回车分割行
    field字段 默认通过空格分割
  4. 取行

  5. 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
    

    image-20220118135135300

  6. 取列

    -F 指定每一列结束标记的分割符(默认是空格,连续的空格,制表符tab)

    $1 取出第一列

    $0整行的内容

    image-20220118135935840

    image-20220118140112402

  7. 取出第一列和最后一列

    awk -F: '{print $1,$NF}' filename

  8. 综合案例:

    [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
    
  9. awk模式匹配

    比较符号:><= !=

    正则

    范围表达式

    特殊条件:BEGIN 和 END

  10. 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
    
  11. 范围表示

    • /xxx/,/xxx/{print $1}
    • NR==1,NR==5 类似于 sed -n '1,5p'
  12. 特殊条件 :

    模式 含义 应用场景
    BEGIN{} 在awk读取文件之前执行 (1)进行简单的统计,计算,不涉及读取文件
    (2)处理文件之前,添加表头
    END{} 在awk读取文件之后执行 (1)awk进行统计,先进行计算,最后END里输出结果
    (2)awk数组,来输出数组的结果
    # 统计 /etc/service 里面有多少个空行
    [root@Outis threetools]# 
    awk '/^$/{i++}END{print i}' /etc/services 
    17
    
  13. awk数组

    awk 'BEGIN{a[0]="oldboy";a[1]="lidao";print a[0],a[1]}'
    
    # awk中字母会被识别成变量,需要双引号括起来才行
    
    for(i in array)
    	# print i                 变量获取到的是数组的下标
    	print array[i]           #这样即可
    
  14. 案例:

    # 统计出现次数
    
    [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
    
  15. awk 循环与判断

    for(i=1;i<=10;i++) print i

    if(a=1) print "hello world ! "

  16. 案例:

    # 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
    
Outis Yang
Outis Yang
2024 Undergraduate in Cyberspace Security

My research interests include Internet of Vehicles(IoV), Penetration Testing and Security research.