zoukankan      html  css  js  c++  java
  • tr、wc、uniq、grep、diff

    字符转换

    tr 的作用一:替换(不改变源文件)

    作用:字符转换工具
    只能对stdin操作,不能直接对文件操作
    格式: tr set1 set2 (同一位置set2替换set1)
    例① 普通的替换

    # echo 123456123456|tr 345 abc
    12abc612abc6

    例② 在文本里的替换

    # tr heze jinan < fuxingkai.txt 
    fuxingkai njongyiyang
    jana
    laarning linux

    所以,并不能单词替换单词,仅仅是单个字符的一一对应替换!

    例③ [ ]中括号表示范围的替换

    # tr [a-z] [A-Z] <fuxingkai.txt 
    FUXINGKAI ZHONGYIYANG
    HEZE
    LEARNING LINUX

    例④:

    # tr    ':'   '
    ' <fuxingkai.txt 
    将文件中的:全部替换为换行

    tr的作用二:删除

    tr -d  [0:9]  删除09的数字    
    tr -d  ‘%’    删除%字符

    tr的作用三:压缩(去重)

    tr -s  SET        
    将连续相同的字符压缩成一个字符
    # echo "1   2   3  4"|tr -s ' '  '	'
    1    2    3    4
    (	  代表制表符)

    单引号和双引号的不同

    • 单引号:输出纯字符,特殊符号失去作用;
    • 双引号:元字符可以有特殊含义。
    # meinv=qianqian    ---定义变量meinv,赋值qianqian
    # echo "$meinv"     ---输出meimv的值
    qianqian
    # echo '$meinv'     ---输出$meinv
    $meinv

    $ 元字符:能代表其他含义的字符,有特殊含义的字符,并不是代表本身字符的含义。


    sort命令(不改变源文件)

    作用:排序。默认按每行的第一个字符排序。

    • -n:按数值大小进行排序;
    • -r:递减排序(整行整行的处理) reverse;
    • -k 3 指定第三列为排序键;
    • -t: 指定字段分割符(默认分隔符是空白(空格、Tab))。

    PS:
    sort排序是按照行来排序的,可以理解为一行是一个整体!!


    uniq命令

    数据的实例统计。
    作用:删除经过排序后的数据的重复记录。通常和sort连用。sort -n 文件 | uniq

    • -c:统计特定记录出现的次数;
    • -u:只显示唯一的行;
    • -d:只显示重复的行。
    # cat access_log |awk '{print $1}'|sort |uniq -c|sort  -nr|head -3  ---只取第一列
        666 172.16.68.155
        648 172.16.70.199
        490 172.16.88.88

    cut命令(截取)

    从文本文件或者文本流中提取文本列
    格式:cut -选项 提取范围 文本文件常见选项

    • -c:从指定提取范围中提取字符;
    • -f:从指定提取范围中提取字段(=列);
    • -d:指定分隔符默认是Tab。
    #cut -d “:” -f 1,7 /etc/passwd
    #who | cut  -d ' '  -f1,6          提取范围
    • n:第n项;
    • n-:第n项到行尾;
    • -m:行首到第m项;
    • n,m:第n项和第m项—单个的截取;
    • n-m:第n项到第m项。
    # cat name.txt |cut -c 2
    将文件里的每一行的第2个字符截取出来
    u
    1
    1
    2
    3
    # cat name.txt |cut -c 2-5   截取第2个字符到第5个字符
    umbe
    12  
    11  
    2   
    3   
    # cat name.txt |cut -c -10  ---行首到第十项
    number nam
    112      l
    111      l
    22      zh
    23      de
    # cat name.txt |cut -c 5-    ---第五项到末尾
    er name  age  address   phone
         liu   18    shandong 123
         li    20    hennan   345
        zhang 16    beijing  789
        deng  86    hubei    467
    
    # cat name.txt 
    number name  age  address   phone
    112      liu   18    shandong 123
    111      li    20    hennan   345
    22      zhang 16    beijing  789
    23      deng  86    hubei    467
    # cat name.txt |tr -s " "|cut -d " " -f 3
    age
    18
    20
    16
    86
    # cat name.txt |tr -s " "|cut -d' ' -f3
    age
    18
    20
    16
    86

    小结

    • tr
      • -d 删除;
      • -s 去重。
    • sort
      • -n 按数值大小排序;
      • -k3 指定第三列为排序列;
      • -r 递减。
    • uniq
      • -c 提取字符;
      • -f 提取字段(==列);
      • -d ‘%’ :按%来分隔字段。

    练习

    ①只显示/etc/fstab文件的第三列
    # cat /etc/fstab|tr -s " "|cut -d ' ' -f3
    
    ②用du -a只显示/boot目录下对象的占用空间,并按由小到大排序
    # du -a /boot|cut -f1|sort -n
    
    ③只显示网卡eth0的IP地址
    #ip add|tail -3|head -1|tr -s ' '|cut -d ' ' -f3
    
    ④用fdisk -l命令只显示出分区和文件系统的类型
    # fdisk -l|grep ^/dev/|tr -s " "|cut -d " " -f 1,7
    /dev/sda1 Linux
    /dev/sda2 LVM
    或 
    # fdisk -l|grep ^/dev/|awk '{print $1,$7}'
    /dev/sda1 Linux
    /dev/sda2 LVM
    ⑤统计/etc/passwd文件中sbin这个单词出现多少次
    # cat /etc/passwd|grep -o sbin --color|wc -l
    
    --color  匹配的字符串显示颜色
    -o     只是显示匹配的字符串,其他的都不显示

    正则表达式:

    按照某种正常的规则组合起来的一个表达式,此表达式包含特殊字符+字符+数字等,用来表示一个特定的含义。

    • 基本正则:特殊字符比较少;
    • 扩展正则:元字符比较多,新加入了一些进来。
      例:
    # cat /etc/fstab |grep -E  -v  "^#|^$"
    不显示以#开头的行或者空行

    grep命令(相当于过滤)

    格式:grep -[acinv] ‘搜索内容串’ filename

    • -a:以文本文件方式搜索;
    • -c:计算找到的符合行的次数;
    • -i:忽略大小写;
    • -n:顺便输出行号;
    • -o:只显示匹配的内容;
    • -v:反转查找,输出与模式不相符的行 -v, –invert-match;

    扩展

    • -E:支持扩展正则表达式。
    [root@chinaitsoft lianxi]# cat fruit.txt |grep -i apple
    apple
    orange   APPLE
    peach   APPLE  456
    [root@chinaitsoft lianxi]#

    PS:
    egrep==grep -E ,效果一样。

    在/lianxi目录下查找文件内容里包含apple的文件,显示出来:
    # grep -r  apple  /lianxi
    /lianxi/shuiguo.txt:apple
    /lianxi/fruit.txt:apple
    Binary file /lianxi/gcc-c++-4.4.7-4.el6.x86_64.rpm matches

    wc 统计命令

    • -l:统计行数;
    • -w:统计单词数 (前后都是空白的一组字符);
    • -c:统计字符数(可见和不可见的字符)。
    • -

    练习

    1、查找出当前passwd文件中以ftp或者mail开头的行,在屏幕上输出。
    # cat passwd|grep -E "^ftp|^mail" 
    
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    
    2、查找出当前passwd文件中首行不是以r、m、f开头的行,在屏幕上输出。
    # cat passwd |grep -E -v "^r|^m|^f"    
    (或"^[rmf]")
    [rmf]  代表r或者m或者f中的一个。
    [a-z]    代表从a-z,中间很多字符
    3、查找出当前passwd文件中以bash结尾的行。
    # cat passwd |grep -E "bash$"
    4、查找出/etc/login.defs文件中的有效行(不显示空行和注释行)。
    # cat /etc/login.defs |grep -E -v "^$|^#"

    diff命令:文件差异对比

    diff命令:
    比较两个文件之间的差异,输出结果为两个文件的不同之处。
    diff命令的输出格式:

    • -u:会将不同的地方放在一起,紧凑易读;
    • -r: 递归比较目录下的所有文件;
    • 利用diff命令生成补丁。

    文件和文件的比较:

    # diff -u chinaitsoft.txt  chinaitsoft_v2.txt 
    
    --- chinaitsoft.txt    2016-01-17 00:53:23.093940085 +0800
    +++ chinaitsoft_v2.txt    2016-01-17 00:51:25.747839493 +0800
    @@ -1,4 +1,6 @@         ---@@代表一段范围
     jinan                  -代表第一个文件
    +changqing                    
     linux
     chinasotf
    
    +teacher feng
    # diff -u chinaitsoft.txt  chinaitsoft_v2.txt >v1-to-v2.patch
    生成补丁,补丁叫作v1-to-v2.patch

    patch 打补丁命令

    用途:用来打补丁修补文件

    格式:patch [选项] 原始文件 < 补丁文件

    • -pN: N表示忽略N层路径;
    • -R: 还原到老版本。
      注意事项:
    • 如果打多个补丁,注意先后顺序;
    • 打补丁前不要修改源文件。
    # patch  chinaitsoft.txt <v1-to-v2.patch 
    patching file chinaitsoft.txt
    # diff chinaitsoft.txt chinaitsoft_v2.txt 
    还原到原来的版本--->撤销打补丁
    # patch -R chinaitsoft.txt <v1-to-v2.patch 
    patching file chinaitsoft.txt
    # diff chinaitsoft.txt chinaitsoft_v2.txt 
    1a2
    > changqing
    3a5
    > fenglaoshi

    目录和目录的比较

    1.新建目录及子目录和普通的文件
    [root@chinaitsoft lianxi]# mkdir  qq
    [root@chinaitsoft lianxi]# cd qq/
    [root@chinaitsoft qq]# ls
    [root@chinaitsoft qq]# cp /etc/hosts  .
    [root@chinaitsoft qq]# ls
    hosts
    [root@chinaitsoft qq]# mkdir  image  sound
    [root@chinaitsoft qq]# ls
    hosts  image  sound
    [root@chinaitsoft qq]# cd image/
    [root@chinaitsoft image]# ls
    [root@chinaitsoft image]# echo 123 >1.txt
    [root@chinaitsoft image]# ls
    1.txt
    [root@chinaitsoft image]#
    [root@chinaitsoft image]# cd ..
    [root@chinaitsoft qq]# ls
    hosts  image  sound
    [root@chinaitsoft qq]# cd sound/
    [root@chinaitsoft sound]# echo "789" >3.txt
    [root@chinaitsoft sound]# ls
    3.txt
    [root@chinaitsoft sound]# cd ..
    [root@chinaitsoft qq]#
    [root@chinaitsoft qq]# cd ..
    
    
    2.生成一个升级版本的目录
    -r 递归的去比较子文件夹里的内容
    [root@chinaitsoft lianxi]# cp qq qqv2 -r
    
    [root@chinaitsoft lianxi]# diff -ur qq qqv2
    
    
    3.更新qqv2里的内容
    [root@chinaitsoft lianxi]# cd qqv2
    [root@chinaitsoft qqv2]# ls
    hosts  image  sound
    [root@chinaitsoft qqv2]# cp /etc/passwd .
    [root@chinaitsoft qqv2]# ls
    hosts  image  passwd  sound
    [root@chinaitsoft qqv2]# cd sound/
    [root@chinaitsoft sound]# echo "8900" >6.txt
    [root@chinaitsoft sound]# cd ..
    [root@chinaitsoft qqv2]# ls
    hosts  image  passwd  sound
    [root@chinaitsoft qqv2]# echo "123456" >hosts 
    [root@chinaitsoft qqv2]# ls
    hosts  image  passwd  sound
    [root@chinaitsoft qqv2]#
    [root@chinaitsoft qqv2]# cd ..
    [root@chinaitsoft lianxi]# diff -Nur  qq qqv2  
    -N 如果没有文件,就拿一个空文件和别的目录里的文件比较。
    比较文件夹生成补丁:
    [root@chinaitsoft lianxi]# diff -Nur  qq qqv2  >patch-v2.txt
    /u/howard/src/blurfl/blurfl.c
    -p3 的效果就是去掉第3个/前面的内容,效果如下:
    src/blurfl/blurfl.c
    -p4 的效果就是去掉第4个/前面的内容,效果如下:
    blurfl/blurfl.c
  • 相关阅读:
    模糊匹配
    UPDATE SET FROM WHERE 续
    SQL SERVER 中row_number用法
    临时表和表变量
    镜像
    经典行列转换
    表记录查询最快查询方式
    NULL不是数值
    自增长值
    JSON
  • 原文地址:https://www.cnblogs.com/lpeng94/p/12546511.html
Copyright © 2011-2022 走看看