• Linux数据提取命令


    Linux数据提取命令

    cut

    简介

    数据切分

    语法

    cut OPTION [FILE]

    使用说明

    从标准输入或者文件数据的每一行出入中切分字节、字符或字段并这些字节、字符和字段打印至标准输出,如果不指定FILE参数,
    cut命令将读取标准输入。必须制定-b、-c或-f标志之一

    常用参数:

    * -b:以字节为单位进行分割。
    * -c:以字符为单位进行分割
    * -d:自定义分割符,默认为制表符
    * -f:与-d一起使用,指定显示哪个区域
    

    例子

    特殊说明

    1)#号后面是注释,不是命令,不要在Linux下运行

    ydqun@VM-0-9-ubuntu cut % cat cut.txt                                                                                   
    123 456 789 abc def ghi
    ydqun@VM-0-9-ubuntu cut % cat cut.txt | cut -d " " -f 1 #以空格为分割符,切分后取第一个分割的字符段                                                                
    123
    ydqun@VM-0-9-ubuntu cut % cat cut.txt | cut -d " " -f 2 #以空格为分割符,切分后取第二个分割的字符段                                                                
    456
    ydqun@VM-0-9-ubuntu cut % cat cut.txt | cut -b 5-7 #以字节为单位进行分割,提取第5-7个字节的字符段                                                                      
    456
    ydqun@VM-0-9-ubuntu cut % cat cut.txt | cut -c 5-7 #以字符为单位进行分割,提取第5-7个字节的字符段                                                                     
    456
    ydqun@VM-0-9-ubuntu cut %   
    

    tr

    简介

    用于转换或阐述文件中或标准输入中的字符

    语法

    tr [-cdst][--help][--version][第一字符集][第二字符集]
    tr [OPTION]…SET1[SET2]

    使用说明

    Linux tr 命令用于转换或删除文件中的字符。
    tr 指令从标准输入设备读取数据,经过字符串转译后,将结果输出到标准输出设备。

    常用参数说明

    * -c, --complement:反选设定字符。符合SET1字符集的字符不做处理,不符合的剩余部分才进行转换
    * -d, --delete: 删除指令字符
    * -s, --squeeze-repeats:缩减连续重复的字符成指定的单个字符
    * -t, --truncate-set1:删除第一个字符集中较第二个字符集多出来的字符
    

    例子

    特殊说明

    1)#号后面是注释,不是命令,不要在Linux下运行

    例子

    ydqun@VM-0-9-ubuntu cut % echo "123   456     abcdefg 789 aa"                                                                           
    123   456     abcdefg 789 aa
    ydqun@VM-0-9-ubuntu cut % echo "123   456     abcdefg 789 aa" | tr "a-z" " "  #不用OPTION 直接把小写字母全部替换成空格字符,即第一字符集[a-z]转换成第二字符集[ ]                                                         
    123   456             789
    ydqun@VM-0-9-ubuntu cut % echo "123   456     abcdefg 789 aa" | tr -c "0-9" " " #用-c选项 把非数字的字符全部替换成空格字符,即非第一字符集[0-9]转换成第二字符集[ ],但是发现多了一个%,这是因为把换行符给转换了                                                        
    123   456             789    % 
    ydqun@VM-0-9-ubuntu cut % echo "123   456     abcdefg 789 aa" | tr -c "0-9
    " " " #在第一字符集上加上
    ,就可以解决                                                   
    123   456             789
    ydqun@VM-0-9-ubuntu cut % echo "123   456     abcdefg 789 aa" | tr -c "0-9" " " | tr -s " " #用-s " ",压缩多余的空格字符 
    123 456 789 % 
    ydqun@VM-0-9-ubuntu cut % echo "123   456     abcdefg 789 aa" | tr -c "0-9" " " | tr -s " " | tr " " "
    "  #不加[OPTION],把第一字符集的字符替换成第二字符集
    123
    456
    789
    

    grep

    简介

    Linux grep 命令用于查找文件里符合条件的字符串。

    语法

    grep [-acinv]

    常用参数说明

    * -a: 将二进制文件以普通文件的形式搜索数据
    * -c: 统计搜寻到的次数
    * -i:忽略大小写
    * -n: 顺序输出行号
    * -v: 不包含string的内容输出
    

    使用说明

    grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。

    特殊说明

    1)#号后面是注释,不是命令,不要在Linux下运行

    例子

    ydqun@VM-0-9-ubuntu cut % cat grep.txt                                                                                                  
    ydqun  1 111
    YDQUN  2 222
    haha   3 444
    ydqun@VM-0-9-ubuntu cut % grep "ydqun" grep.txt  #在文件grep.txt种查找带有ydqun字符串的一行数据
    ydqun  1 111
    ydqun@VM-0-9-ubuntu cut % grep "ydqun" grep.txt  -i #忽略大小写                                                                                    
    ydqun  1 111
    YDQUN  2 222
    ydqun@VM-0-9-ubuntu cut % grep "ydqun" grep.txt -i -v #搜索除了YDQUN和ydqun之外的数据行                                                                                  
    haha   3 444
    ydqun@VM-0-9-ubuntu cut % grep "ydqun" -i -c  grep.txt #统计不分大小写的ydqun字符串出现的行数                                                                                                                                                   
    2
    

    sort

    简介

    Linux sort命令用于将文本文件内容加以排序

    语法

    sort [-fbMnrtuk]<file_or_stdio>

    常用参数说明

    * -f: 忽略大小写
    * -b: 忽略前面的空格符
    * -M: 以月份名称排序
    * -n: 以纯数字方式排序
    * -r: 反向排序
    * -u: uniq 去重
    * -t: 分割符,默认[TAB](制表符)
    * -k: 以哪个区间排序
    

    使用说明

    sort可针对文本文件的内容,以行为单位来排序。

    特殊说明

    1)#号后面是注释,不是命令,不要在Linux下运行

    例子

    计算机期末考成绩出来了,计算机老师教给zhangsan一个任务,帮忙帮他整理一下这个成绩文件,假设以下是某个班的所有同学计算机学科的成绩的文件grade.txt,有顺序的输出这个成绩文件里的内容,其中登记成绩时,有一位同学的成绩重复登记。

    ydqun@VM-0-9-ubuntu cut % cat grade.txt                                                                      
    zhangsan 80
    lisi     76
    wangwu   90
    zhaoliu  87
    sunqi    79
    zhouba   88
    wujiu    100
    zhaoliu  87
    

    1.按照名字字母的顺序排序,并去掉重复登记的同学的成绩记录

    ydqun@VM-0-9-ubuntu cut % sort grade.txt -u                                                                 
    lisi     76
    sunqi    79
    wangwu   90
    wujiu    100
    zhangsan 80
    zhaoliu  87
    zhouba   88
    

    2.按照成绩排名,成绩高的在前面

    ydqun@VM-0-9-ubuntu cut % sort grade.txt -t " " -k 2  -u #以空格为分割符,去分割后的第二个字段作为排序,发现100排在前面                                                   
    wujiu    100
    lisi     76
    sunqi    79
    zhangsan 80
    zhaoliu  87
    zhouba   88
    wangwu   90
    ydqun@VM-0-9-ubuntu cut % sort grade.txt -t " " -k 2  -u  -n  #加上-n,就可以用数字去排序,而不是第一个字符的ASCII值去排序
    lisi     76
    sunqi    79
    zhangsan 80
    zhaoliu  87
    zhouba   88
    wangwu   90
    wujiu    100
    ydqun@VM-0-9-ubuntu cut % sort grade.txt -t " " -k 2  -u  -n -r  #加上-r,实现成绩高的在前面
    wujiu    100
    wangwu   90
    zhouba   88
    zhaoliu  87
    zhangsan 80
    sunqi    79
    lisi     76
    

    wc

    简介

    Linux wc命令用于统计字符,字数,行数

    语法

    wc [-lwm] <file_or_stdin>

    常用参数说明

    * -l: 仅列出行号
    * -w: 仅列出多少字
    * -M: 仅列出多少字符
    

    使用说明

    利用wc指令我们可以计算文件的Byte数、字数、或是列数,若不指定文件名称、或是所给予的文件名为"-",则wc指令会从标准输入设备读取数据。

    特殊说明

    1)#号后面是注释,不是命令,不要在Linux下运行

    例子

    有一篇英语文章,我们来统计它的行号,字数和字符数

    ydqun@VM-0-9-ubuntu cut % cat article.txt                                                                                                                                                                 
    A man was going to the house of some rich person.As he went along the road,he saw a box of good apples at the side of the road.He said,"I do not want to
    eat those apples; for the rich man will give me much food; he will give me very nice food to eat." Then he took the apples and threw them away into the
    dust.He went on and came to a river.The river had become very big; so he could not go over it.He waited for some time; then he said,"I cannot go to the
    rich man's house today,for I cannot get over the river."He began to go home.He had eaten no food that day.He began to want food.He came to the apples,
    and he was glad to take them out of the dust and eat them. Do not throw good things away; you may be glad to have them at some other time.
    
    #直接不输入参数,结果为5行,155个单词,共749个字符
    ydqun@VM-0-9-ubuntu cut % wc article.txt                                                                     
      5 155 749 article.txt
    
    #加-l只统计有多少行
    ydqun@VM-0-9-ubuntu cut % wc -l article.txt                                                                 
    5 article.txt
    
    #加-w统计有多少个单词
    ydqun@VM-0-9-ubuntu cut % wc -w article.txt                                                                  
    155 article.txt
    
    #加-c统计有多少个字符
    ydqun@VM-0-9-ubuntu cut % wc -c article.txt                                                                  
    749 article.txt
    

    uniq

    简介

    Linux uniq命令用于文本文件中重复出现的行列

    语法

    uniq [-cdiu]

    常用参数说明

    * -c 或 --count: 在每行旁边显示该行重复出现的次数
    * -d 或 --repeated: 仅显示重复出现的行列 
    * -i 或 --ignore-case: 忽略大小写
    * -u 或 --unique: 仅显示不重复的行
    

    使用说明

    Linux uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。

    特殊说明

    1)#号后面是注释,不是命令,不要在Linux下运行

    例子

    假设有个成绩表格文件uniq.txt,里面有很多重复成绩项,我们去处理它。

    ydqun@VM-0-9-ubuntu cut % cat uniq.txt                                                                       
    zhangsan  30
    zhangsan  30
    lisi      40
    lisi      40
    wangwu    50
    zhaoliu   60
    zhaoliu   60
    zhaoliu   60
    sunqi     70
    zhouba    80
    zhouba    80
    wujiu     90
    wujiu     90
    wujiu     90
    wujiu     90
    
    #不带任何参数直接去除重复项
    ydqun@VM-0-9-ubuntu cut % uniq uniq.txt                                                                      
    zhangsan  30
    lisi      40
    wangwu    50
    zhaoliu   60
    sunqi     70
    zhouba    80
    wujiu     90
    #加上-c,去除重复项的同时,显示重复的次数
    ydqun@VM-0-9-ubuntu cut % uniq uniq.txt -c                                                                 
          2 zhangsan  30
          2 lisi      40
          1 wangwu    50
          3 zhaoliu   60
          1 sunqi     70
          2 zhouba    80
          4 wujiu     90
    #甚至利用管道|和sort一起配合使用,起排序重复项
    ydqun@VM-0-9-ubuntu cut % uniq uniq.txt -c | sort  
          1 sunqi     70
          1 wangwu    50
          2 lisi      40
          2 zhangsan  30
          2 zhouba    80
          3 zhaoliu   60
          4 wujiu     90
    #-d选项,仅列出有重复项的部分,wangwu和sunqi只有一项,不输出,-c计数
    ydqun@VM-0-9-ubuntu cut % uniq uniq.txt -d -c                                                               
          2 zhangsan  30
          2 lisi      40
          3 zhaoliu   60
          2 zhouba    80
          4 wujiu     90
    #-u选项,仅列出没有重复项的部分,顺便-c验证是否没有重复
    ydqun@VM-0-9-ubuntu cut % uniq uniq.txt -u  -c                                                               
          1 wangwu    50
          1 sunqi     70
    

    tee

    简介

    Linux tee命令用于读取标准输入的数据,并将其内容输出成文件。

    语法

    tee [-ai] file

    常用参数说明

    * -a 或 --append: 附加到既有文件的后面,而非覆盖它
    * -b 或 --ignore-interrupts: 忽略中断信号 
    * --help
    

    使用说明

    tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。

    特殊说明

    1)#号后面是注释,不是命令,不要在Linux下运行

    例子

    ydqun@VM-0-9-ubuntu cut % cat test.txt | tee tee_file                                                        
    Hello world!
    Hello c!
    Hello cpp!
    Hello China!
    ydqun@VM-0-9-ubuntu cut % cat tee_file                                                                       
    Hello world!
    Hello c!
    Hello cpp!
    Hello China!
    ydqun@VM-0-9-ubuntu cut % cat test.txt | tee tee_file  -a                                                    
    Hello world!
    Hello c!
    Hello cpp!
    Hello China!
    ydqun@VM-0-9-ubuntu cut % cat tee_file                                                                       
    Hello world!
    Hello c!
    Hello cpp!
    Hello China!
    Hello world!
    Hello c!
    Hello cpp!
    Hello China!
    

    split

    简介

    Linux split命令用于将一个文件分割成数个

    语法

    spilt [-bl] PREFIX

    常用参数说明

    * -<行数>: 指定每多少行切成一个小文件
    * -b <字节>: 指定每多少字节切成一个小文件
    * -b: 忽略前面的空格符
    

    使用说明

    Linux split命令用于将一个文件分割成数个,该指令将大文件分割成较小的文件,在默认情况下将按照每1000行切割成一个小文件。

    特殊说明

    1)#号后面是注释,不是命令,不要在Linux下运行

    例子

    ydqun@VM-0-9-ubuntu split % cat name.txt                                                                     
    xiaoming
    xiaohong
    xiaozhi
    xiaolan
    xiaoqun
    yuqun
    yuhua
    zhiming
    yanzhi
    yanhua
    yuanhua
    songhua
    tansheng
    tanbin
    lihu
    hujun
    huli
    hukai
    luwei
    luben
    ydqun@VM-0-9-ubuntu split % split name.txt -l 10                                                             
    ydqun@VM-0-9-ubuntu split % ls                                                                               
    name.txt  xaa  xab
    ydqun@VM-0-9-ubuntu split % cat xaa                                                                          
    xiaoming
    xiaohong
    xiaozhi
    xiaolan
    xiaoqun
    yuqun
    yuhua
    zhiming
    yanzhi
    yanhua
    

    xargs

    简介

    Linux 参数代换

    语法

    xargs [-0pne]

    常用参数说明

    * 将特殊字符还原为普通字符
    * -eEOF:当xargs读到EOF时停止
    * -p: 执行指令前询问
    * -n num: 每次执行command时需要的参数个数
    

    例子

    ydqun@VM-0-9-ubuntu xargs % cat 1.txt 2.txt                                                                                            
    hello world!
    Hello cpp!
    #这里我们是想找出所有后缀为.txt的文件,并用cat去查看这些文件的内容,而不出打印出它们的名字,也就是|(管道)前的命令的输出不是做为
    #|(管道)后的命令的标准输入,而是作为第二条命令的参数输入。
    ydqun@VM-0-9-ubuntu xargs % find ./ -name "*.txt" | cat                                                                                
    ./2.txt
    ./1.txt
    #用xargs把|(管道)前的命令的标准输出作为管道后的命令的参数输入
    ydqun@VM-0-9-ubuntu xargs % find ./ -name "*.txt" | xargs cat                                                                          
    Hello cpp!
    hello world!
    

    综合运用习题

    1.tr命令对文件的重命名,内容的替换操作。

    第一题

    “1 2 3 4 5 6 7 9 a v 你好 . /8”
    求以上字符串中所有数字之和

    ydqun@VM-0-9-ubuntu xargs % echo "1 2 3 4 5 6 7 9 a v 你好 . /8 .txt" #原本的输出
    1 2 3 4 5 6 7 9 a v 你好 . /8 .txt
    ydqun@VM-0-9-ubuntu xargs % echo "1 2 3 4 5 6 7 9 a v 你好 . /8 .txt" | tr -c -s "0-9" "
    " #把所有非数字的字符转化为
    字符,并压缩重复的
    换行符
    1
    2
    3
    4
    5
    6
    7
    9
    8
    ydqun@VM-0-9-ubuntu xargs % for i in `echo "1 2 3 4 5 6 7 9 a v 你好 . /8 " | tr -c -s  "0-9
    " "
    "`; do #使用shell的for循环加命令替换符``求和     
    sum=$[ $sum + i ]
    done
    ydqun@VM-0-9-ubuntu xargs % echo ${sum}                                                                             
    45
    

    第二题

    请将该文件中所有大写字母转换为小写
    echo “ABCefg” >> test.log

    ydqun@VM-0-9-ubuntu xargs % echo "ABCefg" >> test.log                                                               
    ydqun@VM-0-9-ubuntu xargs %                                                                                         
    ydqun@VM-0-9-ubuntu xargs % cat test.log | tr "A-Z" "a-z" > test.log                                                
    ydqun@VM-0-9-ubuntu xargs % cat test.log                                                                           
    abcefg
    

    2.找到PATH变量中的最后一个路径。

    ydqun@VM-0-9-ubuntu xargs % echo ${PATH} | tr ":" "
    " | tail -1  #先用tr命令,把环境变量中的:转化为
    ,在用tail取最后一行                                                  
    /snap/bin
    

    3.使用last命令,输出所有的关机信息。

    ydqun@VM-0-9-ubuntu xargs % last | grep boot #用last命令+grep查看即可
    

    4.将/etc/passwd中的内容按照用户名字典序排序。

    ydqun@VM-0-9-ubuntu cut % cat /etc/passwd | sort                                                                           
    _apt:x:104:65534::/nonexistent:/usr/sbin/nologin
    backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
    bin:x:2:2:bin:/bin:/usr/sbin/nologin
    cjj:x:1002:1002:caijunjie,E6,none,none,none:/home/cjj:/bin/bash
    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
    dnsmasq:x:107:65534:dnsmasq,,,:/var/lib/misc:/usr/sbin/nologin
    games:x:5:60:games:/usr/games:/usr/sbin/nologin
    glj:x:1001:1001:guolujuan,110,***********,******,None:/home/glj:/bin/bash
    gnats:x:41:41:Gnats Bug-Reporting System (admin):/var/lib/gnats:/usr/sbin/nologin
    . . . . . . 
    www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
    

    5.将/etc/passwd中的内容按uid排序。

    ydqun@VM-0-9-ubuntu cut % cat /etc/passwd | sort -t ":" -k 3  -n #先用-t指定:为分隔符,取分隔后的第三部分(就是uid),在加-n表示以纯数字形式排序
    root:x:0:0:root:/root:/bin/bash
    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
    bin:x:2:2:bin:/bin:/usr/sbin/nologin
    sys:x:3:3:sys:/dev:/usr/sbin/nologin
    sync:x:4:65534:sync:/bin:/bin/sync
    games:x:5:60:games:/usr/games:/usr/sbin/nologin
    man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
    lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
    mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
    news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
    uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
    . . . . . . 
    nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
    

    6.在云主机上查找系统登录用户的总人次。

    ydqun@VM-0-9-ubuntu cut % last | grep -v "wtmp" | grep -v  "boot" | grep -v  "^$" | wc  -l #过滤掉wtmp,boot和空行(^$),在用wc去计算行数即可                                 
    204
    

    7.将云主机中登录的所有用户名,按照次数排序,并输出次数。

    ydqun@VM-0-9-ubuntu ~ % last | grep -v "^$"  | grep -v "wtmp" | grep -v "boot"| cut -d " " -f 1  | sort | uniq -c #过滤掉wtmp,boot和空行(^$),然后用cut截取登录的用户,再用sort排序,最后用uniq去重并统计
          4 cjj
        203 ydqun
    

    8.将本地的/etc目录下的文件及目录,每十条保存到一个文件中。

    ydqun@VM-0-9-ubuntu split % ls /etc/ | split -l 10  #用split指定ls /etc命令的标准输入的每10行作为一个新文件                                                                                                                                                     
    ydqun@VM-0-9-ubuntu split % ls                                                                                                                                                                           
    xaa  xab  xac  xad  xae  xaf  xag  xah  xai  xaj  xak  xal  xam  xan  xao  xap  xaq  xar  xas  xat
    ydqun@VM-0-9-ubuntu split % cat xaa                                                                                                                                                                      
    acpi
    adduser.conf
    alternatives
    apm
    apparmor
    apparmor.d
    apport
    apt
    at.deny
    bash.bashrc
    

    9.将/etc/passwd中存放的第10到20个用户,输出uidgidgroups

    ydqun@VM-0-9-ubuntu split % cat /etc/passwd  | head -20 | tail -10  | cut -d  ":" -f 1 | xargs -n 1 id #用cat配合head和tail就可以取出中间10行,并截取出这10行的用户名,并用xargs把每个用户名当做id的一个参数去查询                                                                                                   
    uid=10(uucp) gid=10(uucp) groups=10(uucp)
    uid=13(proxy) gid=13(proxy) groups=13(proxy)
    uid=33(www-data) gid=33(www-data) groups=33(www-data)
    uid=34(backup) gid=34(backup) groups=34(backup)
    uid=38(list) gid=38(list) groups=38(list)
    uid=39(irc) gid=39(irc) groups=39(irc)
    uid=41(gnats) gid=41(gnats) groups=41(gnats)
    uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup)
    uid=100(systemd-network) gid=102(systemd-network) groups=102(systemd-network)
    uid=101(systemd-resolve) gid=103(systemd-resolve) groups=103(systemd-resolve)
    

    10.将按照用户名查看/etc/passwd中的用户,读到'sync'用户是结束。

    ydqun@VM-0-9-ubuntu split % cat /etc/passwd | cut -d ":" -f 1  | xargs -n 1 -esync id                                                                                                                     [0]
    uid=0(root) gid=0(root) groups=0(root)
    uid=1(daemon) gid=1(daemon) groups=1(daemon)
    uid=2(bin) gid=2(bin) groups=2(bin)
    uid=3(sys) gid=3(sys) groups=3(sys)
    
    

    11.词频统计

    使用下面这个命令生成一个文本文件。
    cat >> a.txt << xxx
    nihao hello hello 你好
    nihao
    hello

    ls

    cd
    world
    pwd
    xxx
    统计a.txt中各词的词频,并按照从大到小的顺序输出。

    cat a.txt  | tr -s " " "
    " | sort  | uniq -c | sort  -r
    
  • 相关阅读:
    centos7 mongodb3.4 安装
    centos7 开放端口号
    Junit4测试Spring
    selenium浏览器内核监测处理
    mitmproxy(TLS错误)
    爬虫计算两张验证图片的距离(情况一)
    git的git bash使用
    算法
    RBAC权限管理设计
    beego框架返回json数据
  • 原文地址:https://www.cnblogs.com/ydqblogs/p/14292773.html
Copyright © 2020-2023  润新知