zoukankan      html  css  js  c++  java
  • 管道命令总结

    管道命令

    概念

             管道命令只会处理stdout,忽略stderr

             管道命令后面接的第一个数据必定是命令,这个命令必须能够接收stdin

    双向重定向

             tee

                       用途:让stdout转存一份到文件内,并将同样的数据继续送到屏幕处理

                       tee [-a] file

                                a                不加a为>到file,加a为>>到file

    [yc@yc temp]$ ls
    1.txt
    [yc@yc temp]$ cat 1.txt
    aaaaa
    bbbbb
    ccccc
    [yc@yc temp]$ cat 1.txt | tee -a tee.log | grep b
    bbbbb
    [yc@yc temp]$ ls
    1.txt  tee.log
    [yc@yc temp]$ cat tee.log
    aaaaa
    bbbbb
    ccccc

    关于减号-的用途

             用来替代stdin 和stdout

    [yc@yc temp]$ ls
    a  b
    [yc@yc temp]$ ls a
    1.txt  2.txt  3.txt
    [yc@yc temp]$ ls b
    [yc@yc temp]$ tar -cvf - a/ | tar -xvf - -C b/
    a/
    a/1.txt
    a/2.txt
    a/3.txt
    a/
    a/1.txt
    a/2.txt
    a/3.txt
    [yc@yc temp]$ ls b/
    a
    [yc@yc temp]$ ls b/a/
    1.txt  2.txt  3.txt

    行的选取命令

      grep

                       用途:分析一行信息,如果当中有我们需要的信息,就将该行拿出来

                      grep [-A] [-B] [-acEinv] [--color=auto] '查找字符串' filename

                                -A            后跟数字n,表after,除了该行,列出其后n行

                                -B            后跟数字n,表before,除了该行,列出其前n行

                               a                将binary文件以text文件的方式查找数据

                                c                 计算找到'查找字符串'的次数

                                E                后跟扩展型正则表达式,一般用egrep代替,详见正则表达式

                                i                  忽略大小写

                                n                输出行号

                                v                 反向选择,即查找没有'查找字符串'的那一行

                                --color-auto               将找到的关键字颜色显示

    # 查找特定字符串+显示行号
    grep –n ‘the’ regular_express.txt
    
    # 查找非特定字符串+不区分大小写
    ps aux | grep -i tomcat | grep –v grep
    
    # 将关键字所在行的前两行和后三行一起显示
    dmesg | grep –n –A3 –B2 –color=auto 'eth'

                                更多grep命令例子见正则表达式

    sed工具

             用途:对数据进行替换、删除、新增、选取特定行、直接修改文件内容

             sed [-nefr] [n1[,n2]] function

             sed –f [filename]

             set –i [n1[,n2]] function [filename]

                       n       安静模式,只有选取的那一行会被列出来

                       e       直接在命令行模式上进行sed的动作编辑

                       f        直接将sed的动作写在一个文件内,-f filename可以执行filename内的sed动作

                       r        sed的动作支持的是扩展型正则表达式的语法,默认基础型

                       i        直接修改读取的文件内容,而不是由屏幕输出

                       n1,n2        代表进行动作的行数,不加代表全部,加则比如10(第10行)或10,20(10-20行)

                       function

                                a       新增,后接字符串,字符串在新的一行出现,目前的下一行

                                c       替换,后接字符串,字符串替换n1和n2之间的行

                                d       删除,后不跟参数

                                i        插入,后跟字符串,字符串在新的一行出现,目前的上一行

                                p       打印,将选择的数据打印出来,通常与sed –n一起运行

                                s       替换,后跟正则表达式,替换字符与被替换字符都在动作内包含

    # 删除第2~5行
    nl /etc/passwd | sed '2,5d'
    
    # 在第二行后面新增两行字
    nl /etc/passwd | sed '2a Drink tea or[Enter]drink beer ?'
    注:[Enter]为输入后按回车,即可表示新一行的开始’
    
    # 替换第2~5行为”No 2-5 number”
    nl /etc/passwd | sed '2,5c No 2-5 number'
    
    # 查看第10~20行
    nl /etc/passwd | sed '10,20p'
    
    # 通过s得到目前主机的ip
    ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' | sed 's/Bcast.*$//g'
    
    # 直接删除空白行(不用cat、vim等打开该文件)
    sed -i '/^[[:space:]]*$/d' /etc/passwd
    
    # 直接替换文件内字符串(不用cat、vim等打开该文件,适用于大文件的替换)
    sed –i 's/https://www.xxx.com:443/http://www.yyy.com/g' test.txt

    行的排序命令

             sort

                       用途:依据不同的数据类型来排序

                       sort [-fbMnrtuk] [file or stdin]

                                f                 忽略大小写的差异

                                b                忽略最前面的空格符部分

                                M               以月份的名字来排序

                                n                以纯数字排序

                                r                 反向排序

                                t                 分隔符,默认使用[Tab]分隔

                                u                unique,相同的数据只出现一行代表

                                k                 以那个区间来进行排序

    # 排序passwd,使用:做分隔符,使用第三列进行排序
    cat /etc/passwd | sort -t ':' -k 3

    行的统计命令

             wc

                       用途:统计多少字、多少行、多少字符

                       wc [-lwm]

                                l        仅列出多少行

                                w      仅列出多少字(英文单字)

                                m      仅列出多少字符

             uniq

                       用途:相同的数据,仅出现一行代表

                       特殊:可以计数

                       uniq [-ic]

                                i                 忽略大小写,等效于sort -fu

                                c                 进行计数

    数据切割

      cut

                       用途:将一行信息的某一段切出来

                       缺点:处理多空格相连的数据比较差

                       cut -d '分隔字符' -f fields

                                -d               后面接分割字符,与-f一起使用

                                -f                依据-d将一段信息切割成数段,用-f取出第几段

    # 取出PATH的第五个路径
    echo $PATH | cut -d ':' -f 5
    
    # 取出PATH的第三个和第五个路径
    echo $PATH | cut -d ':' -f 3,5

                       cut -c 字符范围

                                -c               以字符为单位取出固定字符区间

    # 取出每一行12个字符之后的所有字符
    export|cut -c 12-
    
    # 取出每一行第12~20之间的所有字符
    export|cut -c 12-20

      xargs

                       用途:分别通过分割(-i)与分批(-n)行为产生某个命令的参数

                       接收stdin,以指定字符进行分隔,将stdin分成多个arguments

                       主要用于连接两个非管道命令

                       xargs [-0edpni] command

                                0                将stdin中的特殊字符(如`,等)还原为一般字符

                                e                后接字符串,表示分析到指定字符串的时候,停止分析(end of file)

                                d                指定分割字符,而不是默认的空格符

                                p                执行每个命令,都会询问用户

                                n                指定每次command使用几个参数

                                i                  不使用i只能传递到最后。使用-i后,可以使用{}指定将参数传递到哪,也可以多个

    [yc@yc temp]$ cut -d ':' -f 1 /etc/passwd| sed -n '1,3p' | xargs -i id {}
    uid=0(root) gid=0(root) groups=0(root)
    uid=1(bin) gid=1(bin) groups=1(bin)
    uid=2(daemon) gid=2(daemon) groups=2(daemon)

      awk

            用途:以列为单位将一行数据分隔成数个“字段”来处理

            awk ‘条件1{动作1} 条件2{动作2} ...’ filename

       内置变量(可更改)

                          NF   每一行$0拥有的字段总数

                          NR  目前awk所处理的是“第几行”数据

                          FS   目前的分隔字符,默认空格键

                          $0    代表一整行数据

                          $1    代表第一个字段

                          $2    代表第二个字段

                          ...    ...

                   关键字

                          BEGIN   如果需要更改内置变量(如特殊的分隔字符),内置变量的更改默认情况下从第二行开始,使用BEGIN,代表从第一行之前就开始设置awk的内置变量,适用于特殊分隔字符+第一行也为所需要的数据的情况

                          END              同上,最后一行设置内置变量

            简单用法:列出某一个字段

    # 列出目前活动的进程号(第二个字段)
    ps aux | awk ‘{printf $2}’

            高级用法:通过指定条件筛选行与列来得到想要的数据

                   使用内置变量+逻辑运算符筛选

                          显示有4个字段的一整行(NF+逻辑符+$0)

                                 cat test.log | awk ‘NF==4{printf $0}’

                          显示第一行第二个和第四个字段+冒号:分隔符+printf简单定制(BEGIN+FS+NR+printf的单引号变双引号;空格变逗号)

                                 cat test.log | awk ‘BEGIN {FS=”:”} NR==1{print “%s %s”,$2,$4}’

                   使用自定义变量+内置变量+逻辑运算符+多条命令作一个动作对数据+printf高级定制进行运算(FS+NR+printf的单引号变双引号;空格变逗号;分行必须用 +一个动作中多条命令用;分隔+变量声明不能用declare -i)

          

                         得到每一行的分数总和

                                cat test.log | awk 'NR==1{printf "%s %s %s %s %s %s ",$1,$2,$3,$4,$5,"total"} NR>=2{total=$2+$3+$4;printf "%s %i %i %i %3.2f %i ",$1,$2,$3,$4,$5,total}'

             

                          得到某一列的分数和

                                 declare -i second=0;cat test.log|awk 'NR>=2{second=(second+$3)} NR==4{printf "%i ",second}'

            

        高级awk用法

          https://www.cnblogs.com/emanlee/p/3327576.html

    字符转换命令

             tr

                       用途:删除或替换一段信息当中的文字

                       tr [-ds] SET1 ...

                                无参数时进行替换操作

                                d                删除信息当中的SET1

                                s                 重复的SET1只用一个表示

    [yc@yc temp]$ cat a.log
    aab,bbc,ccd,dda
    AAB,BBC,CCD,DDA
    # 小写变大写
    [yc@yc temp]$ cat a.log | tr '[a-d]' '[A-D]'
    AAB,BBC,CCD,DDA
    AAB,BBC,CCD,DDA
    # 小写去重复
    [yc@yc temp]$ cat a.log | tr -s '[a-d]'
    ab,bc,cd,da
    AAB,BBC,CCD,DDA
    # 小写变大写去重复
    [yc@yc temp]$ cat a.log | tr -s '[a-d]' '[A-D]'
    AB,BC,CD,DA
    AB,BC,CD,DA

             col

                       用途:将[Tab]按键替换为对等的空格键

                       经常用来将man page转存为纯文本文件以方便查阅

                       col [-xb]

                                x                 将[Tab]键转换为对等的空格键

                                b                文字内有/时,仅保留/最后接的那个字符

                                例

                                         cat /etc/man.confg|col -x| cat -A| more

                                         man col | col -b > /root/col.man

             join

                       用途:两个文件当中有相同数据的那一行加在一起

                       注意:两个文件最好事先经过排序(相同数据那一行)

                       join [-ti12] file1 file2

                                t                 指定分隔符号,默认空格符

                                i                  忽略大小写

                                1                指定第一个文件用那个字段来分析

                                2                制定第二个文件用哪个字段来分析

                                例

                                         将两个文件第一个字段相同者整成一行

                                                  join -t ':' /etc/passwd /etc/shadow

                                         使用GID将两个文件整成一行

                                                   join -t ':' -1 4 /etc/passwd -2 3 /etc/shadow

                                                  注:结果GID会在第一列,其余列按顺序排列,相同的前几个字段不再出现

             paste

                       用途:将两个文件每一行都粘在一起,[TAB]键隔开,不进行匹配,只复制粘贴

                       paste [-d] file1 file2

                                d                后接分隔字符,默认[TAB]

             expand

                       将[TAB]键转换为空格键,可以自定义一个[TAB]键对应多少个字符

                       expand [-t] file

                                t                 后接数字,默认为8个

             unexpand

                       将空格转换为[Tab]键

                       unexpand [-at] file

                                a                转换所有空格

                                t                 后接数字,默认为8个

                       unexpand [--first-only] file              仅转换开头

    文件的相关处理

    printf(printf不是管道命令,因为常用与管道命令,所以总结到此)

             用途:将数据输出的结果格式化

             printf ‘打印格式’ 实际内容

                       a              警告声音退出

                                     退格键

                       f               清除屏幕

                                     输出新的一行

                                      [Enter]键

                                      水平的[Tab]键

                       v               垂直的[Tab]键

                       xNN         NN为两位数的数字,可以转换数字成为字符

                       常见的变量格式

                                %ns           n为数字,s为string,即多少个字符

                                %ni            n为数字,i为integer,即多少整数字数

                                %N.nf       n与N都是数字,f为float,如果有小数字数,%10,2f表示10个整数位,2个小数位

                       例

                                printf '%s %s %s %s %s ' $(cat test.txt)

                                         printf不是管道命令,只能用$()先执行获得stdout

                                         %s表任意长度的字符串, 表示制表位[Tab]

              

                                printf '%10s %5i %5i %5i %8.2f ' $(cat test.txt) |grep -v Name

                                         %10s表示10个长度的字符串

                                         %5i表示5个长度的整数

                                         $8.2f表示8个整数位,2个小数位的浮点数

              

                                printf 'x45 '

                                        列出十六进制45代表的字符--E

    文件切割命令

             spilt

                       将一个大文件依据文件大小或行数来切割成为小文件

                       spilt [-bl] file PREFIX

                                b                后接欲切割的单位文件大小,可跟单位,b,k,m等

                                l                  后接欲切割的单位文件行数

                                PREFIX               代表前导符,表示切割成为的文件名字的前几个字符

                       例

                                cd /tmp ; spilt -b 300k /etc/termcap termcap

                                         得到termcapaa,termcapab,termcapac...

             切割文件的合并

                       cd /tmp ; cat termcap* >> termcapbak

    sed其实也算文件处理

  • 相关阅读:
    Linux 常用命令
    Oracle DG 三种模式(转)
    S5PV2210
    Timer wheel etc.
    SCM etc.
    负载均衡 IO etc.
    Remoting,OData Snippet Compiler等
    displaytag 动态列实现
    <display:column>属性解释
    <display:table>属性解释
  • 原文地址:https://www.cnblogs.com/yc913344706/p/7045873.html
Copyright © 2011-2022 走看看