• 运维管道和重定向语法


    (1).输出重定向

      定义:将命令的标准输出结果保存到指定的文件中,而不是直接显示在显示器上。

      输出重定向使用>和>>操作符。

      语法:cmd > filename,表示将标准输出写入文件,如果此文件已存在,将覆盖原文件的内容。如果不存在,则新建该文件。

         cmd >> filename,表示将标准输出追加到文件,如果文件不存在,则新建该文件。

    实例1:查看当前主机的CPU类型保存到cpu.txt文件中,而不是直接显示到屏幕上。

    1
    2
    3
    4
    //如果想要直接查看CPU信息
    [xf@xuexi ~]$ cat /proc/cpuinfo
    //那么相应的输出重定向如下
    [xf@xuexi ~]$ cat /proc/cpuinfo > cpu.txt

    实例2:将内核版本信息追加到cpu.txt

    1
    2
    3
    4
    5
    6
    7
    //如果想要查看系统基本信息
    [xf@xuexi ~]$ uname -r
    3.10.0-957.5.1.el7.x86_64
    [xf@xuexi ~]$ uname -a
    Linux xuexi 3.10.0-957.5.1.el7.x86_64 #1 SMP Fri Feb 1 14:54:57 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
    //那么相应的追加如下
    [xf@xuexi ~]$ uname -a >> cpu.txt

    实例3:清空一个文件

    1
    [xf@xuexi ~]$ > cpu.txt

    (2).输入重定向

       定义:将命令中接收输入的途径有默认键盘改为其他文件,而不是等待从键盘输入。

      输入重定向使用<操作符。

    实例:

    1
    2
    3
    4
    5
    6
    [xf@xuexi ~]$ grep root /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    [xf@xuexi ~]$ grep root < /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin

    mysql数据库导入数据,格式如下

    1
    [xf@xuexi ~]$ mysql -uroot -p123456789 < a.sql

    (3).EOF

      EOF本意是End Of File,表明到了文件末尾。EOF通常与<<结合使用,<<EOF表示后续的输入作为子命令或子shell的输入,知道遇到EOF,再次返回主shell,可将其理解为分界符。既然是分界符,那么形式自然不是固定的,这里可以将EOF进行自定义,但是前后的分界符必须成对出现且不能和shell命令冲突。

     实例1:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    [xf@xuexi ~]$ cat > a.txt << EOF
    > This is a file.
    > EOF
    [xf@xuexi ~]$ cat a.txt
    This is a file.
    [xf@xuexi ~]$ cat >> a.txt << EOF
    > My name is xf.
    > EOF
    [xf@xuexi ~]$ cat a.txt
    This is a file.
    My name is xf.
    [xf@xuexi ~]$ cat > b.txt << ccc
    > This is a file.
    > EOF
    > ccc
    [xf@xuexi ~]$ cat b.txt
    This is a file.
    EOF

    实例2:在脚本中我们可以通过重定向输入来打印消息菜单。可以自定义。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    [xf@xuexi ~]$ vim c.sh
    //文件内容如下
    #! /bin/bash
     
    cat << EOF
    ===================================
    mysql
    httpd
    oracle
    ===================================
    EOF
    //保存退出
    [xf@xuexi ~]$ chmod +x c.sh
    [xf@xuexi ~]$ ./c.sh
    ===================================
    mysql
    httpd
    oracle
    ===================================

    (4).错误重定向

      定义:将命令执行过程中出现的错误信息(选项或参数错误)保存到指定文件,而不是直接显示到显示器。

      错误重定向使用2>和2>>操作符(2表示的是标准错误的文件描述符)

      语法:cmd 2> filename,表示将标准错误写入文件,如果此文件已存在,将覆盖原文件的内容。如果不存在,则新建该文件。

         cmd 2>> filename,表示将标准错误追加到文件,如果文件不存在,则新建该文件。

      在实际应用中,错误重定向可以用于收集执行的错误信息,为排错提供依据;对于shell脚本还可以将无关紧要的错误信息重定向到空文件/dev/null,以保持脚本输出的简洁。

    实例1:将错误显示的内容与正确显示的内容分开

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [xf@xuexi ~]$ ls /etc/passwd xxxx
    ls: 无法访问xxxx: 没有那个文件或目录
    /etc/passwd
    [xf@xuexi ~]$ ls /etc/passwd xxxx > a.txt
    ls: 无法访问xxxx: 没有那个文件或目录
    [xf@xuexi ~]$ cat a.txt
    /etc/passwd
    [xf@xuexi ~]$ ls /etc/passwd xxxx 2> a.txt
    /etc/passwd
    [xf@xuexi ~]$ cat a.txt
    ls: 无法访问xxxx: 没有那个文件或目录

    实例2:正确的内容写入一个文件,错误的内容写入另一个文件

    1
    2
    3
    4
    5
    [xf@xuexi ~]$ ll /etc/passwd xxxx > right.txt 2> err.txt
    [xf@xuexi ~]$ cat right.txt
    -rw-r--r--. 1 root root 2257 2月  13 16:19 /etc/passwd
    [xf@xuexi ~]$ cat err.txt
    ls: 无法访问xxxx: 没有那个文件或目录

    (5).null黑洞和zero空文件

      把/dev/null看做“黑洞”,所有写入它的内容都会永远丢失。而尝试从该文件读取内容也什么都读不到。然而/dev/null对命令行和脚本都非常有用。

       /dev/zero在类UNIX操作系统中,是一个特殊的文件,当你读它时,它会提供无限的空字符(NULL,ASCII NUL,0x00)。典型用法是用它来产生一个特定大小的空白文件。

    实例1:使用dd命令产生一个50M的空白文件,空白文件可以临时当做设备文件使用

    1
    2
    3
    4
    5
    6
    7
    8
    [xf@xuexi ~]$ dd if=/dev/zero of=1.txt bs=M count=50
    记录了50+0 的读入
    记录了50+0 的写出
    52428800字节(52 MB)已复制,0.0508383 秒,1.0 GB/秒
    [xf@xuexi ~]$ ll -h 1.txt
    -rw-rw-r--. 1 xf xf 50M 2月  26 10:17 1.txt
    [xf@xuexi ~]$ cat 1.txt
    [xf@xuexi ~]$

      /dev/zero也可以用于清除分区头。

    (6).&>和>&符号

      &表示等同于的意思。除了&>和>&以外还有&>>

    实例1:把标准输出与标准错误写入到同一个文件,此实例使用&>和>&有多种写法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    [xf@xuexi ~]$ ls /tmp xxxx >1.txt 2>&1
    [xf@xuexi ~]$ ls /tmp xxxx 2>2.txt 1>&2
    [xf@xuexi ~]$ ls /tmp xxxx &> 3.txt
    [xf@xuexi ~]$ ls /tmp xxxx >& 4.txt
    [xf@xuexi ~]$ cat 1.txt
    ls: 无法访问xxxx: 没有那个文件或目录
    /tmp:
    ssh-2yPDLej8lp2k
    systemd-private-fb4d19bcb21b4301aa41f11d24a7deab-bolt.service-3sZXoj
    systemd-private-fb4d19bcb21b4301aa41f11d24a7deab-chronyd.service-rUnYOY
    systemd-private-fb4d19bcb21b4301aa41f11d24a7deab-colord.service-go7dw4
    systemd-private-fb4d19bcb21b4301aa41f11d24a7deab-cups.service-o7nKmx
    systemd-private-fb4d19bcb21b4301aa41f11d24a7deab-fwupd.service-GN4Clw
    systemd-private-fb4d19bcb21b4301aa41f11d24a7deab-rtkit-daemon.service-59x6Qx
    tracker-extract-files.0
    tracker-extract-files.1000
    VMwareDnD
    vmware-root_6784-2823359541
    vmware-root_6814-2822835244
    vmware-root_6819-3879179857
    vmware-root_6821-3879048790
    vmware-root_6829-3845623896
    vmware-root_6834-2865236895
    vmware-root_6839-3854340548
    vmware-root_6843-3879573071
    vmware-root_6844-2831682966
    vmware-root_6849-4156467083
    vmware-root_6850-3100130775
    vmware-root_6851-4148143625
    vmware-root_6855-4156336012
    vmware-root_6863-4122911106
    vmware-root_6874-3099737545
    vmware-root_6883-4147619377
    vmware-root_6889-4122255805
    yum_save_tx.2019-02-21.14-15.ehxi5q.yumtx
    yum_save_tx.2019-02-25.09-56.0qBBLA.yumtx
    yum_save_tx.2019-02-26.10-23.gFGrHz.yumtx
    [xf@xuexi ~]$ diff 1.txt 2.txt
    [xf@xuexi ~]$ diff 1.txt 3.txt
    [xf@xuexi ~]$ diff 1.txt 4.txt

    实例2:把标准输出与标准错误追加到文件中

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    [xf@xuexi ~]$ ll > 1.txt
    [xf@xuexi ~]$ cat 1.txt
    总用量 0
    -rw-rw-r--. 1 xf xf 0 2月  26 13:34 1.txt
    drwxr-xr-x. 2 xf xf 6 9月   6 11:43 公共
    drwxr-xr-x. 2 xf xf 6 9月   6 11:43 模板
    drwxr-xr-x. 2 xf xf 6 9月   6 11:43 视频
    drwxr-xr-x. 2 xf xf 6 9月   6 11:43 图片
    drwxr-xr-x. 2 xf xf 6 9月   6 11:43 文档
    drwxr-xr-x. 2 xf xf 6 9月   6 11:43 下载
    drwxr-xr-x. 2 xf xf 6 9月   6 11:43 音乐
    drwxr-xr-x. 2 xf xf 6 11月 19 13:29 桌面
    [xf@xuexi ~]$ ls /tmp xxxx &>>1.txt
    [xf@xuexi ~]$ cat 1.txt
    总用量 0
    -rw-rw-r--. 1 xf xf 0 2月  26 13:34 1.txt
    drwxr-xr-x. 2 xf xf 6 9月   6 11:43 公共
    drwxr-xr-x. 2 xf xf 6 9月   6 11:43 模板
    drwxr-xr-x. 2 xf xf 6 9月   6 11:43 视频
    drwxr-xr-x. 2 xf xf 6 9月   6 11:43 图片
    drwxr-xr-x. 2 xf xf 6 9月   6 11:43 文档
    drwxr-xr-x. 2 xf xf 6 9月   6 11:43 下载
    drwxr-xr-x. 2 xf xf 6 9月   6 11:43 音乐
    drwxr-xr-x. 2 xf xf 6 11月 19 13:29 桌面
    ls: 无法访问xxxx: 没有那个文件或目录
    /tmp:
    ssh-7dArISEgeS0O
    systemd-private-6596f9db642a46ae9174a8ca3ace2009-bolt.service-UElQVL
    systemd-private-6596f9db642a46ae9174a8ca3ace2009-chronyd.service-oIQjdt
    systemd-private-6596f9db642a46ae9174a8ca3ace2009-colord.service-8hFZOp
    systemd-private-6596f9db642a46ae9174a8ca3ace2009-cups.service-7i8U0x
    systemd-private-6596f9db642a46ae9174a8ca3ace2009-fwupd.service-SWULra
    systemd-private-6596f9db642a46ae9174a8ca3ace2009-rtkit-daemon.service-jYXFJl
    tracker-extract-files.0
    tracker-extract-files.1000
    VMwareDnD
    vmware-root_6784-2823359541
    vmware-root_6814-2822835244
    vmware-root_6819-3879179857
    vmware-root_6821-3879048790
    vmware-root_6829-3845623896
    vmware-root_6834-2865236895
    vmware-root_6839-3854340548
    vmware-root_6843-3879573071
    vmware-root_6844-2831682966
    vmware-root_6849-4156467083
    vmware-root_6850-3100130775
    vmware-root_6851-4148143625
    vmware-root_6855-4156336012
    vmware-root_6863-4122911106
    vmware-root_6874-3099737545
    vmware-root_6883-4147619377
    vmware-root_6889-4122255805
    yum_save_tx.2019-02-21.14-15.ehxi5q.yumtx
    yum_save_tx.2019-02-25.09-56.0qBBLA.yumtx
    yum_save_tx.2019-02-26.10-23.gFGrHz.yumtx

    实例3:shell脚本中的/dev/null 2>&1是什么意思呢?

    1
    [xf@xuexi ~]$ ls /etc/passwd >/dev/null 2>&1

    注:将标准输出和标准错误全部重定向到/dev/null中,也就是将产生的所有信息丢弃。

     (7).管道符|的使用

      语法: command -a | command -b | command -c | ...

    注意:1、管道命令只处理前一个命令标准输出,不处理标准错误

       2、管道右边的命令,必须是一个能够接收前一个命令的标准输出的数据流的命令才行

       3、管道可以把两个命令连起来,它可以连接多个命令使用

    实例1:对应注意1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    [xf@xuexi ~]$ ls /tmp xxxx
    ls: 无法访问xxxx: 没有那个文件或目录
    /tmp:
    ssh-7dArISEgeS0O
    systemd-private-6596f9db642a46ae9174a8ca3ace2009-bolt.service-UElQVL
    systemd-private-6596f9db642a46ae9174a8ca3ace2009-chronyd.service-oIQjdt
    systemd-private-6596f9db642a46ae9174a8ca3ace2009-colord.service-8hFZOp
    systemd-private-6596f9db642a46ae9174a8ca3ace2009-cups.service-7i8U0x
    systemd-private-6596f9db642a46ae9174a8ca3ace2009-fwupd.service-SWULra
    systemd-private-6596f9db642a46ae9174a8ca3ace2009-rtkit-daemon.service-jYXFJl
    tracker-extract-files.0
    tracker-extract-files.1000
    VMwareDnD
    vmware-root_6784-2823359541
    vmware-root_6814-2822835244
    vmware-root_6819-3879179857
    vmware-root_6821-3879048790
    vmware-root_6829-3845623896
    vmware-root_6834-2865236895
    vmware-root_6839-3854340548
    vmware-root_6843-3879573071
    vmware-root_6844-2831682966
    vmware-root_6849-4156467083
    vmware-root_6850-3100130775
    vmware-root_6851-4148143625
    vmware-root_6855-4156336012
    vmware-root_6863-4122911106
    vmware-root_6874-3099737545
    vmware-root_6883-4147619377
    vmware-root_6889-4122255805
    yum_save_tx.2019-02-21.14-15.ehxi5q.yumtx
    yum_save_tx.2019-02-25.09-56.0qBBLA.yumtx
    yum_save_tx.2019-02-26.10-23.gFGrHz.yumtx
    [xf@xuexi ~]$ ls /tmp xxxx | grep /tmp
    ls: 无法访问xxxx: 没有那个文件或目录  //可以看到标准错误没有被处理,仍然输出
    /tmp:

    实例2:对应注意3

    1
    2
    3
    4
    5
    [xf@xuexi ~]$ ps -aux | grep sshd
    root       7418  0.0  0.2 112860  4312 ?        Ss   13:19   0:00 /usr/sbin/sshd -D
    xf        10913  0.0  0.0 112728   988 pts/0    S+   14:39   0:00 grep --color=auto sshd
    [xf@xuexi ~]$ ps -aux | grep sshd | grep root
    root       7418  0.0  0.2 112860  4312 ?        Ss   13:19   0:00 /usr/sbin/sshd -D

    (8).tee

    tee [选项] [文件]

    选项:

    1
    2
    3
    4
    -a,--append 内容追加到给定的文件而非覆盖
    -i,--ignore-interrupts 忽略中断信号
    --help 帮助
    --version 版本信息

      将标准输入复制到每个指定文件,并显示到标准输出

    实例1:将磁盘使用的信息写入文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    [xf@xuexi ~]$ df -h | tee disk.log
    文件系统        容量  已用  可用 已用% 挂载点
    /dev/sda3        17G  4.7G   13G   28% /
    devtmpfs        975M     0  975M    0% /dev
    tmpfs           991M     0  991M    0% /dev/shm
    tmpfs           991M   11M  980M    2% /run
    tmpfs           991M     0  991M    0% /sys/fs/cgroup
    /dev/sr0        4.2G  4.2G     0  100% /mnt
    /dev/sda1      1014M  276M  739M   28% /boot
    tmpfs           199M   20K  199M    1% /run/user/1000
    [xf@xuexi ~]$ cat disk.log
    文件系统        容量  已用  可用 已用% 挂载点
    /dev/sda3        17G  4.7G   13G   28% /
    devtmpfs        975M     0  975M    0% /dev
    tmpfs           991M     0  991M    0% /dev/shm
    tmpfs           991M   11M  980M    2% /run
    tmpfs           991M     0  991M    0% /sys/fs/cgroup
    /dev/sr0        4.2G  4.2G     0  100% /mnt
    /dev/sda1      1014M  276M  739M   28% /boot
    tmpfs           199M   20K  199M    1% /run/user/1000

    实例2:将磁盘使用的信息追加到文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    [xf@xuexi ~]$ df -h | tee -a disk.log
    文件系统        容量  已用  可用 已用% 挂载点
    /dev/sda3        17G  4.7G   13G   28% /
    devtmpfs        975M     0  975M    0% /dev
    tmpfs           991M     0  991M    0% /dev/shm
    tmpfs           991M   11M  980M    2% /run
    tmpfs           991M     0  991M    0% /sys/fs/cgroup
    /dev/sr0        4.2G  4.2G     0  100% /mnt
    /dev/sda1      1014M  276M  739M   28% /boot
    tmpfs           199M   20K  199M    1% /run/user/1000
    [xf@xuexi ~]$ cat disk.log
    文件系统        容量  已用  可用 已用% 挂载点
    /dev/sda3        17G  4.7G   13G   28% /
    devtmpfs        975M     0  975M    0% /dev
    tmpfs           991M     0  991M    0% /dev/shm
    tmpfs           991M   11M  980M    2% /run
    tmpfs           991M     0  991M    0% /sys/fs/cgroup
    /dev/sr0        4.2G  4.2G     0  100% /mnt
    /dev/sda1      1014M  276M  739M   28% /boot
    tmpfs           199M   20K  199M    1% /run/user/1000
    文件系统        容量  已用  可用 已用% 挂载点
    /dev/sda3        17G  4.7G   13G   28% /
    devtmpfs        975M     0  975M    0% /dev
    tmpfs           991M     0  991M    0% /dev/shm
    tmpfs           991M   11M  980M    2% /run
    tmpfs           991M     0  991M    0% /sys/fs/cgroup
    /dev/sr0        4.2G  4.2G     0  100% /mnt
    /dev/sda1      1014M  276M  739M   28% /boot
    tmpfs           199M   20K  199M    1% /run/user/1000

    注:可以用来记录日志

  • 相关阅读:
    Python-控制流
    字符串创建运算符#
    Python-操作符和表达式
    Python-基础数据类型
    重载、重写和隐藏
    java加载jdbc驱动三种方式的比较
    Mysql 索引复习笔记
    Java中如何指定跳出多重嵌套循环
    LeetCode第[2]题(Java):Add Two Numbers (链表相加)——Medium
    LeetCode第[26]题(Java):Remove Duplicates from Sorted Array 标签:Array
  • 原文地址:https://www.cnblogs.com/duanlinxiao/p/10797542.html
Copyright © 2020-2023  润新知