Linux重定向与管道技术

一、重定向基础概述

1. 什么是重定向

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

2.为什么需要重定向

  1. 当程序执行输出的信息比较多时,需要保存下来在进行分页查看
  2. 后台执行的程序一般都会有输出,不希望它的输出干扰到屏幕
  3. 定时执行的备份任务,希望将备份的结果保留下来时
  4. 希望将错误日志与正确日志,分别输出保存到不同文件时

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 


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值