• shell 管道命令与过滤器


    1.管道命令的用法

    将两个或者多个命令(程序或者进程)连接到一起,把一个命令的输出作为下一个命令的输入,以这种方式连接的两个或者多个命令就形成了管道(pipe)。管道使用竖线|连接多个命令,这被称为管道符。

    Linux 管道的具体语法格式如下:

    command1 | command2
    command1 | command2 [ | commandN... ]

    当在两个命令之间设置管道时,管道符|左边命令的输出就变成了右边命令的输入。只要第一个命令向标准输出写入,而第二个命令是从标准输入读取,那么这两个命令就可以形成一个管道。

    这里需要注意,command1 必须有正确输出,而 command2 必须可以处理 command1 的输出结果;而且 command2 只能处理 command1 的正确输出结果,不能处理 command1 的错误信息。

    2.使用管道命令的好处:

    命令作用

    3条命令来备份数据库

    mysqldump -u root -p '123456' wiki > /tmp/wikidb.backup

    gzip -9 /tmp/wikidb.backup

    scp /tmp/wikidb.backup username@remote_ip:/backup/mysql/

    • mysqldump 命令用于将wike数据库备份到文件 /tmp/wikidb.backup。
    • gzip 命令用于压缩较大的数据库文件以节省磁盘空间;其中-9表示最慢的压缩速度最好的压缩效果。
    • scp 命令用于将数据库备份文件复制到 IP 地址为 remote_ip 的备份服务器的 /backup/mysql/ 目录下。其中username是登录远程服务器的用户名,命令执行后需要输入密码。

    使用管道命令

    mysqldump -u root -p '123456' wiki | gzip -9 | ssh username@remote_ip "cat > /backup/wikidb.gz"

    • 命令的语法紧凑并且使用简单。
    • 通过使用管道,将三个命令串联到一起就完成了远程 mysql 备份的复杂任务。
    • 从管道输出的标准错误会混合到一起。
    • ssh username@remote_ip "cat > /backup/wikidb.gz"是将上个命令中生成的文件通过cat命令获取文件内容并保存到/backup/wikidb.gz中

    3.重定向和管道的区别

    乍看起来,管道也有重定向的作用,它也改变了数据输入输出的方向,那么,管道和重定向之间到底有什么不同呢?

    简单地说,重定向操作符>将命令与文件连接起来,用文件来接收命令的输出;而管道符|将命令与命令连接起来,用第二个命令来接收第一个命令的输出。如下所示:

    command > file
    command1 | command1

    4.Linux管道实例

      输出
    将 ls 命令的输出发送到 grep 命令,查看文件 log.txt 是否存在于当前目录下

    ls | grep log.txt

    log.txt
    重定向管道的输出到一个文件

    ls -al | grep log.txt >output.txt

    cat output.txt

    -rw-rw-r--. 1 mozhiyan mozhiyan 0 4月 15 17:26 log.txt

    显示按用户名排序后的当前登录系统的用户的信息

    who | sort

    mozhiyan :0 2019-04-16 12:55 (:0)

    mozhiyan pts/0 2019-04-16 13:16 (:0)

    who 命令的输出将作为 sort 命令的输入,所以这两个命令通过管道连接后会显示按照用户名排序的已登录用户的信息。

    5.管道与重定向

    1)管道与输入重定向

    输入重定向操作符<可以在管道中使用,以用来从文件中获取输入,其语法类似下面这样:

    command1 < input.txt | command2
    command1 < input.txt | command2 -option | command3

    功能命令输出
    使用 tr 命令从 os.txt 文件中获取输入,然后通过管道将输出发送给 sort 或 uniq 等命令

    cat os.txt

    • ddd
    • bbb
    • CCC
    • ccc

    tr a-z A-Z <os.txt | sort

    • BBB
    • CCC
    • CCC
    • DDD

    2)管道与输出重定向

    你也可以使用重定向操作符>或>>将管道中的最后一个命令的标准输出进行重定向,其语法如下所示:

    command1 | command2 | ... | commandN > output.txt
    command1 < input.txt | command2 | ... | commandN > output.txt

    功能命令输出
    使用 tr 命令将 os.txt 文件中的内容转化为大写,并使用 sort 命令将内容排序,使用 uniq 命令去除重复的行,最后将输出重定向到文件 ox.txt.new。

    cat os.txt

    • ddd
    • bbb
    • CCC
    • ccc

    tr a-z A-Z <os.txt | sort|uniq>os.txt.new

    cat os.txt.new

    • BBB
    • CCC
    • DDD

    6.过滤器

    过滤器可以概括为两点:

    • 如果一个 Linux 命令是从标准输入接收它的输入数据,并在标准输出上产生它的输出数据(结果),那么这个命令就被称为过滤器。
    • 过滤器通常与 Linux 管道一起使用。


    常用的被作为过滤器使用的命令如下所示:

    命令说明
    awk 用于文本处理的解释性程序设计语言,通常被作为数据提取和报告的工具。
    cut 用于将每个输入文件(如果没有指定文件则为标准输入)的每行的指定部分输出到标准输出。
    grep 用于搜索一个或多个文件中匹配指定模式的行。
    tar 用于归档文件的应用程序。
    head 用于读取文件的开头部分(默认是 10 行)。如果没有指定文件,则从标准输入读取。
    paste 用于合并文件的行。
    sed 用于过滤和转换文本的流编辑器。
    sort 用于对文本文件的行进行排序。
    split 用于将文件分割成块。
    strings 用于打印文件中可打印的字符串。
    tac 与 cat 命令的功能相反,用于倒序地显示文件或连接文件。
    tail 用于显示文件的结尾部分。
    tee 用于从标准输入读取内容并写入到标准输出和文件。
    tr 用于转换或删除字符。
    uniq 用于报告或忽略重复的行。
    wc 用于打印文件中的总行数、单词数或字节数。

    7.过滤器举栗

     功能命令输出知识点
    awk与管道结合 查看系统中的所有的账号名称,并按名称的字母顺序排序

    awk -F: '{print $1}' /etc/passwd | sort|head -5

    • _apt
    • asample
    • backup
    • bin
    • daemon

    -F: 以:作为分隔符,默认分隔符是空格

    '{print $1}'打印第一列信息

      列出当前账号最常使用的 5个命令

    history | awk '{print $2}' | sort | uniq -c | sort -rn | head -5

        

    •      17 cat
    •      14 vim
    •      11 sudo
    •       7 ll
    •       7 cd

    uniq -c 在每列旁边显示该行重复出现的次数。

    sort -rn 按照数值的大小反向排序

      显示当前系统的总内存大小,单位为 KB

    free | grep Mem | awk '{print $2}'

    2029860
    free命令可以显示Linux系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer
    cut 与管道命令结合 查看系统中登录 Shell 是/bin/bash的用户名和对应的用户主目录的信息

    grep "bin/bash" /etc/passwd|cut -d : -f1,6

    root:/root

    roaddb:/home/roaddb

    asample:/home/asample

    /ctc/passwd 文件用来存放用户账号的信息,文件中的每一行会记录一个账号的信息,每个字段之间用冒号分隔,第一个字段即是账号的账户名,第六个字段就是账号的主目录的路径。

      查看当前机器的CPU类型

    cat /proc/cpuinfo |grep name|cut -d : -f 2|uniq

    Intel(R) Core(TM) i7-4870HQ CPU @ 2.50GHz  
      查看当前目录下的子目录数

    ls -l|cut -c 1|grep d|wc -l

    4 命令cut -c 1是截取每行的第一个字符
    grep命令 查看系统日志文件中的错误信息

    grep -i "error:" /var/log/messages | less

     

    grep -iv [指定字条串] [文件] 在文件中搜索字符串匹配的行并输出
    -i 不区分大小写 -v 排除指定字符串

      查看系统中 HTTP 服务的进程信息

    ps aux | grep httpd

       
      查找我们的程序列表中所有命令名中包含关键字 zip 的命令

    ls /bin /usr/bin | sort | uniq | grep zip

    • bunzip2
    • bzip2
    • bzip2recover
    • funzip
    • gpg-zip
    • gunzip
     
      查找 /etc 目录下所有包含 IP 地址的文件

    find /etc -type f -exec grep '[0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*[.][0-9][0-9]*' {} ;

       
    tar命令 复制一个目录的整体结构

    tar cf - /home/mozhiyan | ( cd /backup/; tar xf - )

       
      跨网络地复制一个目录的整体结构

    tar cf - /home/mozhiyan | ssh remote_host "( cd /backup/; tar xf - )"

       
      跨网络地压缩复制一个目录的整体结构

    tar czf - /home/mozhiyan | ssh remote_host "( cd /backup/; tar xzf - )"

       
      检査 tar 归档文件的大小,单位为字节

    cd /; tar cf - etc | wc -c

       
      检查 tar 归档文件压缩为 tar.gz 归裆文件后所占的大小

    tar czf - etc.tar | wc -c

       
      检查 tar 归档文件压缩为 tar.bz2 归裆文件后所占的大小

    tar cjf - etc.tar | wc -c

       
    head 命令 显示 ls 命令的前 10 行输出

    ls /usr/bin | head

    • 2to3
    • 2to3-2.7
    • 2to3-3.5
    • X11
    • [
    • aclocal
    • aclocal-1.15
    • acyclic
    • add-patch
    • addpart
    默认的输出行数为 10 行
      显示 ls 命令的前 5 行内容。

    ls /usr/bin | head -n 5

    • 2to3
    • 2to3-2.7
    • 2to3-3.5
    • X11
    • [
     
    uniq命令 去掉输出中重复的行

    sort testfile | uniq

       
      显示输出中各重复的行出现的次数,并按次数多少倒序显示

    sort testfile | uniq -c | sort -nr

       
    wc命令 统计当前登录到系统的用户数

    who | wc -l

    2 wc 命令用于统计包含在文本流中的字符数、单同数和行数
      统计当前的 Linux 系统中的进程数

    ps -ef | wc -l

    70  



  • 相关阅读:
    js设置与获取Cookie
    js,正则应用
    Ajax支持跨域之Web API实现
    RSA加密解密在jsencrypt+c#的实现-博客园加密登录
    转:sqlserver无法创建索引,超时时间已到解决办法
    【转】asp.net 项目在 IE 11 下出现 “__doPostBack”未定义 的解决办法
    c#连接SFTP上传文件
    mac 修改mysql root密码
    Vue学习手记09-mock与axios拦截的使用
    Vue学习手记08-vue-cli的启动过程
  • 原文地址:https://www.cnblogs.com/ting152/p/12554524.html
Copyright © 2020-2023  润新知