内容目录

重定向基础概述

什么是重定向

将原本要输出到屏幕中的数据信息,重新定向到某个指定的文件中,或者定向到黑洞中

为什么需要重定向

  • 当程序执行输出的信息比较多时,需要保存下来在进行分页查看
  • 后台执行的程序一般都会有输出,不希望它的输出干扰到屏幕
  • 定时执行的备份任务,希望将备份的结果保留下来时
  • 当重复创建用户,会提示一些错误信息,可以直接将信息丢弃
  • 希望将错误日志与正确日志,分别输出保存到不同文件时

标准输入与输出

  • 当进程操作一个文件时:
    • 首先程序是无法直接访问硬件,需要借助内核来访问文件
    • 而内核kernel需要利用文件描述符(file descriptor)来访问文件
  • 总结:进程--通过-->文件描述符(非负整数)--访问-->文件名称;进程使用文件描述符来管理打开的文件对应关系
  • 通常程序访问一个文件至少会打开三个标准文件,分别是标准输入、标准输出、错误输出
  • 进程将从标准输入中得到数据,将正常输出打印至屏幕终端,将错误的输出也打印至屏幕终端

file

名称 文件描述符 作用
标准输入(stdin) 0 默认是键盘,也可以是文件或其他命令的输出
标准输出(stdout) 1 默认输出到屏幕
错误输出(stderr) 2 默认输出到屏幕
文件名称(filename) 3+

输出重定向案例

  • 输出重定向,改变输出内容的位置。输出重定向有如下几种方式
类型 操作符 用途
标准覆盖输出重定向 > 将程序输出的正确结果输出到指定的文件中,会覆盖文件原有的内容
标准追加输出重定向 >> 将程序输出的正确结果以追加的方式输出到指定文件,不会覆盖原有内容
错误覆盖输出重定向 2> 将程序输出的错误结果输出到指定的文件中,会覆盖文件原有的内容
错误追加输出重定向 2>> 将程序输出的错误结果以追加的方式输出到指定文件,不会覆盖原有内容

案例1-标准输出重定向

file

  • 标准输出重定向示例
    • 如果文件不存在则创建
    • 如果文件存在则清空内容
> edu.txt
ifconfig eth0 > edu.txt

案例2-标准追加输出重定向

  • 标准追加输出重定向示例
    • 如果文件不存在则创建
    • 如果文件存在则在文件尾巴添加内容

echo "hello students" >> edu.txt

案例3-错误输出重定向

file

  • 标准错误输出重定向
    • 正确输出及错误输出至相同文件
    • 正确输出及错误输出至不同的文件
find /etc -name "*.conf" 1>ok 2>ok
find /etc -name "*.conf" 1>ok 2>err

案例4-混合输出重定向

file

  • 混合输出重定向
    • 将正确输出和错误输出混合至同一文件
    • 将两个文件内容组合为一个文件
find /etc -name "*.conf" &>ab
cat a b > c
  • 正确和错误输出输入到相同文件

file

ls /root /error >ab 2>&1

案例5-将内容输出至黑洞

file

  • 将内容输出至黑洞设备 /dev/null
ls /root /error >ab 2> /dev/null
ls /root /error >ab &>/dev/null

输入重定向案例

  • 输入重定向:指的是重新指定设备代替键盘作为新的输入设备

输入重定向示例

  1. 通过输入重定向读取文件内容

cat /etc/hosts

  1. 通过输入重定向读入多行内容
cat <<EOF
100
99
98
EOF  # 只要不出现EOF则可以一直输入
  1. 通过输入重定向将数据导入至数据库中

mysql -uroot -pxxx < /opt/wordpress.sql

脚本输入重定向

  • 使用脚本输入重定向打印安装服务的菜单导航栏
cat install.sh
#!/usr/bin/bash
cat <<EOF
--------主菜单--------
| 1)安装nginx  |
| 2)安装php    |
| 3)退出       |
----------------------
EOF
read -p "请选择你要安装的软件编号[ 1 | 2 | 3 ]:"

进程管道技术

什么是管道

  • 管道操作符号|,主要用来连接左右两个命令,将左侧的命令的标准输出,交给右侧命令的标准输入
  • 注意事项:无法传递标准错误输出至后者命令
  • 管道命令符能让大家能进一步掌握命令之间的搭配使用方法,进一步提高命令输出值的处理效率

管道流程示意图

  • 格式:cmd1 | cmd2 | [...|cmdn]

file

管道使用案例

  • 案例1:将/etc/passwd中的用户按UID大小排序
sort -t ":" -k3 -n /etc/passwd
sort -t ":" -k3 -n /etc/passwd -r
sort -t ":" -k3 -n /etc/passwd | head
  • 案例2:统计当前/etc/passwd中用户使用的shell类型
awk -F: '{print $7}' /etc/passwd
awk -F: '{print $7}' /etc/passwd | sort
awk -F: '{print $7}' /etc/passwd | sort | uniq
awk -F: '{print $7}' /etc/passwd | sort | uniq -c
  • 案例3:打印并输出当前所有主机所有网卡的IPv4地址

ip addr | grep 'inet ' | awk '{print $2}' | awk -F"/" '{print $1}'

tee与xargs

管道中使用tee

file

ip addr | grep 'inet ' |tee ip.txt | awk '{print $2}' | awk -F"/" '{print $1}'
127.0.0.1
blue.yn.cn
cat ip.txt
inet 127.0.0.1/8 scope host lo
inet blue.yn.cn/24 brd 192.168.99.255 scope global noprefixroute eth0
管道中使用xargs
  • xargs参数传递,主要让一些不支持管道的命令可以使用管道技术
    which  cat | xargs ls -l
    ls | xargs rm -fv
最后修改日期: 2024年9月30日

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。