文章目录
一、重定向基础概述
1. 什么是重定向
将原本要输出到屏幕中的数据信息,重新定向到某个指定的文件中,或者定向到黑洞(/dev/null)中。
2.为什么需要重定向
- 当程序执行输出的信息比较多时,需要保存下来在进行分页查看
- 后台执行的程序一般都会有输出,不希望它的输出干扰到屏幕
- 定时执行的备份任务,希望将备份的结果保留下来时
- 希望将错误日志与正确日志,分别输出保存到不同文件时
3. 标准输入与输出
当进程操作一个文件时,首先进程是无法直接操作文件的需要通过内核来访问文件,而内核 kernel 需要利用文件描述符 (file descriptor) 来访问文件。
进程-------》文件描述符(非负整数)------》访问-----》文件名称,进程通过文件描述符来管理打开文件的对应关系。
tail -f /etc/passwd
过滤 tail 查看进程号
[root@localhost fd]# ps aux |grep tail
root 4422 0.0 0.0 108092 616 pts/2 S+ 12:23 0:00 tail -f /etc/passwd
root 4429 0.0 0.0 112808 964 pts/1 R+ 12:24 0:00 grep --color=auto tail
显示文件
ll /etc/4422/fd
total 0
lrwx------. 1 root root 64 Jul 28 12:24 0 -> /dev/pts/2
lrwx------. 1 root root 64 Jul 28 12:24 1 -> /dev/pts/2
lrwx------. 1 root root 64 Jul 28 12:23 2 -> /dev/pts/2
lr-x------. 1 root root 64 Jul 28 12:24 3 -> /etc/passwd
lr-x------. 1 root root 64 Jul 28 12:24 4 -> anon_inode:inotify
从上面可以看出通过文件描述符3 --> /etc/passwd --> inode --> block
0:代表标准输入
1:代表标准正确输出
2:代表标准错误输出
通常程序访问一个文件至少会打开三个标准文件,分别是标准输入、标准输出、错误输出
进程将从标准输入中得到数据,将正常输出打印至屏幕终端,将错误的输出信息也打印至屏幕终端。
1. 标准输出重定向
1.如果文件不存在则创建
2.如果文件存在则清空内容
[root@localhost ~]# >test.txt
[root@localhost ~]# ifconfig eth32 > test.txt
2.标准追加输出重定向
如果文件不存在则创建
如果文件存在则在文件尾部添加内容
3.错误输出重定向
正确输出及错误输出至相同文件
正确输出及错误输出至不同的文件
[root@localhost ~]# find /etc -name "*.conf" 1>ok 2>ok
[root@localhost ~]# find /etc -name "*.conf" 1>ok 2>err
4.混合和输出重定向
5. 正确和错误都输入到相同位置
[root@localhost ~]# ls /root >test.txt 2>&1
[root@localhost ~]# ls /root &>test.txt
6. 将内容输出至黑洞
[root@localhost ~]# ls /root &>/dev/null
4. 输入重定向
输入重定向:指的是 ”重新指定设备“ 来 “代替键盘” 作为新的输入设备
1.通过输入重定向读取文件内容
[root@localhost ~]# cat < /etc/hosts# cat < /etc/hosts
2.通过输入重定向读入多行内容
[root@localhost ~]# cat >a.txt <<EOF
> 123
> 456
> 789
> EOF # 结束标志
[root@localhost ~]# cat a.txt
123
456
789
[root@localhost ~]#
脚本输入重定向
使用输入重定向打印安装服务的菜单导航栏
[root@localhost ~]# cat install.sh
#!/usr/bin/bash
cat <<-EOF
---------主菜单----------
| 1) 安装nginx |
| 2) 安装php |
| 3) 退出 |
--------------------------
EOF
read -p "请选择你要安装的软件编号 [ 1 | 2 | 3 ]:
输入重定向场景:
1.恢复数据时
2.脚本打印菜单时会用到
3.cat写入文件时
混合输出
&>/dev/null
&>>/dev/null
1>/dev/null 2>&1
$? :代表上条命令的返回值(运行返回值) 当返回值为0表示上条命令运行成功
& :是标准正确和错误输出
> :覆盖重定向(先清空该文件,然后写入新内容)
>> :追加重定向(在原有的文件后写入新内容)
< :输入重定向
1.使用grep过滤文件中包含root的行, 要求使用输入重定向方式(/etc/passwd)
grep 'root' < /etc/passwd
cat /etc/passwd | grep 'root'
grep 'root' /etc/passwd
2.编写一个脚本,要求正确输出到log文件,错误输出到log1文件
echo 111 1>log 2>log1
二、进程中管道技术
1.什么是管道
管道操作符号 “|”,主要用来连接左右两个命令, 将左侧的命令的【标准输出】, 交给右侧命令的【标准输入】
注意: 无法传递标准错误输出至后者命令
2.管道流程示意图
格式: cmd1 | cmd2 [...|cmdn]
例1. 将 /etc/passwd 中的用户按 UID 大小排序
[root@localhost ~]# sort -t":" -k3 -n /etc/passwd
[root@localhost ~]# sort -t":" -k3 -n /etc/passwd -r
[root@localhost ~]# sort -t":" -k3 -n /etc/passwd |head -3
[root@localhost ~]# awk -F: '{print $3}' /etc/passwd | sort -n -r | head -3
例2. 统计当前 /etc/passwd 中用户使用的 shell 类型
[root@localhost ~]# awk -F: '{print $NF}' /etc/passwd | sort | uniq -c | sort -n
例3. 打印并输出当前所有主机所有网卡的 IP 地址
[root@localhost ~]# ifconfig ens32 | awk 'NR==2' | awk '{print $2}'
10.0.0.100
[root@localhost ~]# ifconfig ens32 |grep 'inet ' | awk '{print $2}'
10.0.0.100
2. tee与xargs
管道中的tee
tee可以拦截管道过程到指定的地方(文件、中端等)而并不影响管道的正常传输
取ip并把中间结果输入到文件
# 输出到文件
ip addr |grep 'inet ' |tee -a ip.txt |awk -F"/" '{print $1}' |awk '{print $2}'
# 将tee过程输出到当前字符设备
[root@localhost ~]# tty
/dev/pts/1
ip addr |grep 'inet ' |tee /dev/pts/1 |awk -F"/" '{print $1}' |awk '{print $2}
3. 管道中使用xargs
xargs 参数传递,主要让一些不支持管道的命令可以使用管道技术
[root@localhost ~]# which cat | ls -l # 仍然显示的当前
[root@localhost ~]# which cat |xargs ls -l
-rwxr-xr-x. 1 root root 54080 Aug 20 2019 /usr/bin/cat
[root@localhost ~]# ls | rm -rf
[root@localhost ~]# ls # 不支持管道,并没有删除
anaconda-ks.cfg a.txt edu.txt ip.txt test.txt
[root@localhost ~]# ls |xargs rm -rf
[root@localhost ~]# ls
[root@localhost ~]
[root@localhost ~]# touch {1..100}
[root@localhost ~]# ls |xargs -n 1 # 可以指定每行显示的列
[root@localhost ~]# ls | xargs -n 1 | sed -r 's/(.*)/rm -rf \1/' | bash
[root@localhost ~]# ls |xargs -n 1 |xargs rm -rf