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