Linux之重定向

1,Linux中的重定向到底是个什么呢?

Linux中的重定向就是将原本要输出到屏幕中的数据信息,重新指向某个特定的文件中,或者定向到黑洞(/dev/null)中。

1.2重定向有什么用呢?

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

1.3 标准输入与输出

  • 当进程操作一个文件时:
  • 1,首先进程是无法直接访问硬件的,需要借助内核来访问文件
  • 2,而内核kernel需要利用文件描述符 (file descriptor)来访问文件。
  • 总结:进程---通过--->文件描述符(非负整数)--访问---》文件名称;进程使用文件描述符来管理打开的文件对应关系。
  • 第一步:运行 tail -f /etc/passwd
  • 第二部:通过文件描述符3--->/etc/passwd-->inode-->block
  • 第三步:正确输出--->默认情况下通过文件描述符1--->当前终端 1>(改变输出的位置,文件,黑洞)
  • 第四步: 错误输出--->默认情况下通过文件描述符2---》当前终端 2>(错误输出)
  • 通常程序访问一个文件至少会打开三个标准文件,分别是标准输入,标准输出,错误输出。
  • 进程将从标准输入中得到数据,将正常输出打印至屏幕终端,将错误的输出信息也打印至屏幕终端。

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

2,输出重定向案例

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

2.1,案例1,-标准输出重定向

  • 标准输出重定向示例
  • 1,如果文件不存在则创建
  • 2,如果文件存在则清空内容
[root@Linux.net: ~]#> text.txt
[root@Linux.net: ~]#ifconfig echo > edu.txt

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

  • 标准追加输出重定向示例
  • 1,如果文件不存在则创建
  • 2,如果文件存在则在文件尾部添加内容
[root@Linux.net: ~]#echo "hello linux" >>if

2.3案例3-错误输出重定向

  • 错误输出重定向
  • 1,正确输出及错误输出至相同文件
  • 2,正确输出及错误输出至不同的文件
[root@Linux.net: ~]#find /etc -name "*.conf" 1>ok 2>ok
[root@Linux.net: ~]#find /etc -name "*.conf" 1>ok 2>error

2.4案例4-混合和输出重定向

  • 混合输出重定向
  • 1,将正确输出和错误输出混合至同一文件
  • 2,将两个文件内容组合为一个文件
[root@Linux.net: ~]#find /etc/ -name "*.conf" &>ab
[root@Linux.net: ~]#cat ab >c

*正确和错误都输入到相同位置

[root@Linux.net: ~]#ls /root/ /error >ab 2>&1

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

[root@Linux.net: ~]#ls /root/ /error >ab 2>/dev/null
[root@Linux.net: ~]#ls /root/ /error >ab &>/dev/null

3,输入重定向案例

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

3.1输入重定向示例

  • 1,通过输入重定向读取文件内容;
[root@Linux.net: ~]#cat < /etc/hosts
  • 2,通过输入重定向读入多行内容;
[root@Linux.net: ~]# cat <<EOF
[root@Linux.net: ~]#cat <<EOF
> 1
> 2
> 3
> 4
> 5
> EOF  #只要不出现EOF则可以一直输入

  • 3,通过输入重定向数据导入至数据库中;
[root@Linux.net: ~]#mysql -uroot -p carol.net < /opt/wordpress.sql

3.2脚本输入重定向

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

3.3输入重定向场景

  • 1,恢复数据时

  • 2,脚本打印菜单

  • 3,cat写入文件时;vim

  • 输出重定向

  • 正确输出:
1>:覆盖(先清空,后写入)
1>>:直接写入文件的尾部(末尾)
  • 错误输出
2>:覆盖(先清空,后写入)
2>>:直接写入文件的尾部(末尾)
  • 混合输出
&>/dev/null
&>>/dev/null
1>/dev/null 2>&1

4,进程管道技术

  • 4.1 什么是管道
  • 管道操作符合"|",主要用来链接左右两个命令,将左侧命令的【标准输出】,交给右侧命令的【标准输入】
  • 无法传递错误的标准输出给后者命令
  • 管道命令符可以让大家进一步掌握命令之间的搭配使用方法,进一步提高命令输出值的处理效率

4.2管道流程示意图

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

4.3管道使用案例

  • 案例1:将/etc/passwd中的用户按UID大小排序
[root@Linux.net: ~]#sort -t ":" -k3 -n /etc/passwd
[root@Linux.net: ~]#sort -t ":" -k3 -n /etc/passwd -r
[root@Linux.net: ~]#sort -t ":" -k3 -n /etc/passwd |head

  • 案例2:统计当前/etc/passwd中用户使用的shell类型
#取出第七列(shell)|排序(相同的归类)|去重
[root@Linux.net: ~]#awk -F:`{pint $7}` /etc/passwd |sort |uniq -c

  • 案例3:打印并输出当前所有主机网卡的IP地址
[root@Linux.net: ~]#ip addr |grep 'inet' |awk '{print $2}' |awk -F "/" '{print $1}'

4.4.1,tee与xargs

[root@Linux.net: ~]#ip addr |grep 'inet' |tee ip.txt |awk -F "/" '{print $1}' |awk '{print $2}'

[root@Linux.net: ~]#cat ip.txt

4.4.2,管道中使用xargs

  • xargs参数传递,主要让一些不支持管道的命令可以使用管道技术
[root@Linux.net: ~]#which cat |xargs ls -l
-rwxr-xr-x. 1 root root 54080 Apr 11  2018 /usr/bin/cat
[root@Linux.net: ~]# xargs rm -fv

posted @ 2021-07-17 20:09  Carol-z  阅读(1920)  评论(0编辑  收藏  举报