Linux系统的重定向与管道

重定向与管道

重定向

1.标准输入、标准输出、标准错误

  • FD:file descriptors (文件描述符)
    进程使用文件描述符来管理打开的文件
    打开的文件都有一个fd
    在这里插入图片描述
    标准输入(STDIN) 标准输出(STDOUT) 标准错误(STDERR)
    在这里插入图片描述
    FD是访问文件的标识是链接文件
    0 默认接受来自键盘的输入,即键盘只读
    1,2默认输出到终端窗口,可以理解为终端是屏幕
    3+ 默认为文件,可读可写

  • 示例
    在这里插入图片描述
    看到的0123是FD,程序通过描述符访问文件,
    可以是常规文件,也可以是设备文件。

2.重定向案例

  • 输出重定向

输出重定向分为正确输出,错误输出

> 把STDOUT重定向到文件
2> 把STDERR重定向到文件
&> 把所有输出重定向到文件
> 文件内容会被覆盖
>> 原有内容基础上,追加内容

使用 > 将标准输出的内容指定到某个文件,不直接在屏幕上显示,但是指定的文件内容会被覆盖

在这里插入图片描述

正确输出重定向

[root@localhost ~]# date 
2020年 07月 30日 星期四 19:38:57 CST
[root@localhost ~]# date 1> file1.txt
[root@localhost ~]# cat  file1.txt
2020年 07月 30日 星期四 19:39:25 CST
[root@localhost ~]# 

错误输出重定向
在这里插入图片描述

[root@localhost ~]# ls  /aaaaaaaa
ls: 无法访问/aaaaaaaa: 没有那个文件或目录
[root@localhost ~]# ls  /aaaaaaaa  2> file2.txt
[root@localhost ~]# cat  file2.txt
ls: 无法访问/aaaaaaaa: 没有那个文件或目录
[root@localhost ~]# 


正确、错误 输出重定向



[root@localhost ~]# ls /home/  /aaaaaa &> file3.txt
[root@localhost ~]# cat  file3.txt
ls: 无法访问/aaaaaa: 没有那个文件或目录
/home/:
ll
user1
user2
[root@localhost ~]# 



使用 >> 将标准输出的内容指定到某个文件,不直接在屏幕上显示,原有内容不会被覆盖,追加指定内容。

[root@localhost ~]# date 
2020年 07月 30日 星期四 19:38:57 CST
[root@localhost ~]# date 1> file1.txt
[root@localhost ~]# cat  file1.txt
2020年 07月 30日 星期四 19:39:25 CST
[root@localhost ~]# date  1>> file1.txt   
[root@localhost ~]# cat  file1.txt
2020年 07月 30日 星期四 19:39:25 CST
2020年 07月 30日 星期四 19:40:34 CST

  • 输入重定向发送邮件
    正常邮件编辑发送
[root@localhost ~]# mail -s  "sss"  user1
123123
123123
.      点代表邮件编辑完成
EOT
[root@localhost ~]# su  - user1
[user1@localhost ~]$ mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/user1": 1 message 1 new
>N  1 root                  Thu Jul 30 19:56  19/614   "sss"
& 1
Message  1:
From root@localhost.localdomain  Thu Jul 30 19:56:52 2020
Return-Path: <root@localhost.localdomain>
X-Original-To: user1
Delivered-To: user1@localhost.localdomain
Date: Thu, 30 Jul 2020 19:56:52 +0800
To: user1@localhost.localdomain
Subject: sss
User-Agent: Heirloom mailx 12.5 7/5/10
Content-Type: text/plain; charset=us-ascii
From: root@localhost.localdomain (root)
Status: R

123123
123123
               按邮件编号:1.即可看邮件。
按q 退出。
& q       
Held 1 message in /var/spool/mail/user1
[user1@localhost ~]$ 

输入重定向编辑邮件

[root@localhost ~]# vim  file4.txt
[root@localhost ~]# mail  -s "ssss"  user1 < file4.txt
[root@localhost ~]# su - user1
上一次登录:四 7月 30 19:57:04 CST 2020pts/2 上
[user1@localhost ~]$ mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/user1": 2 messages 1 new
    1 root                  Thu Jul 30 19:56  20/625   "sss"
>N  2 root                  Thu Jul 30 20:02  23/622   "ssss"
& 2
Message  2:
From root@localhost.localdomain  Thu Jul 30 20:02:59 2020
Return-Path: <root@localhost.localdomain>
X-Original-To: user1
Delivered-To: user1@localhost.localdomain
Date: Thu, 30 Jul 2020 20:02:59 +0800
To: user1@localhost.localdomain
Subject: ssss
User-Agent: Heirloom mailx 12.5 7/5/10
Content-Type: text/plain; charset=us-ascii
From: root@localhost.localdomain (root)
Status: R

123
123
123
123
123


& q
Held 2 messages in /var/spool/mail/user1
[user1@localhost ~]$ 

管道

1.管道 " | "

  • 进程管道Piping
    管道命令可以将多条命令组合起来,一次性完成复杂的处理任务。
    使用重定向字符控制输出到文件,使用管道控制输出到其他程序
    语法:command1 | command2 |command3 |…
    在这里插入图片描述
[user1@localhost ~]$ cat /etc/passwd  | tail -3
ll:x:1000:1000:ll:/home/ll:/bin/bash
user1:x:1001:1001::/home/user1:/bin/bash
user2:x:1005:1005::/home/user2:/bin/bash
您在 /var/spool/mail/user1 中有邮件
[user1@localhost ~]$ ps aux  | grep  sshd
root       1204  0.0  0.2 112920  2024 ?        Ss   19:08   0:00 /usr/sbin/sshd -D
user1      3695  0.0  0.0 112732   972 pts/2    R+   20:06   0:00 grep --color=auto sshd

  • tee管道

三通管道,即交给另一个程序处理。又保存一份副本
tee命令主要被用来向standout(标准输出流,通常是命令执行窗口)输出的同时也将内容输出到文件,下面是tee的示例
在这里插入图片描述

[root@localhost ~]# cat /etc/passwd |tee  55.txt |tail -1
user2:x:1005:1005::/home/user2:/bin/bash
[root@localhost ~]# cat 55.txt
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
libstoragemgmt:x:998:996:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
colord:x:997:995:User for colord:/var/lib/colord:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
saslauth:x:996:76:Saslauthd user:/run/saslauthd:/sbin/nologin
abrt:x:173:173::/etc/abrt:/sbin/nologin
setroubleshoot:x:995:992::/var/lib/setroubleshoot:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
gluster:x:994:991:GlusterFS daemons:/run/gluster:/sbin/nologin
chrony:x:993:990::/var/lib/chrony:/sbin/nologin
qemu:x:107:107:qemu user:/:/sbin/nologin
unbound:x:992:989:Unbound DNS resolver:/etc/unbound:/sbin/nologin
tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
usbmuxd:x:113:113:usbmuxd user:/:/sbin/nologin
geoclue:x:991:987:User for geoclue:/var/lib/geoclue:/sbin/nologin
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
saned:x:990:984:SANE scanner daemon user:/usr/share/sane:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
gnome-initial-setup:x:989:983::/run/gnome-initial-setup/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
ntp:x:38:38::/etc/ntp:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
ll:x:1000:1000:ll:/home/ll:/bin/bash
user1:x:1001:1001::/home/user1:/bin/bash
user2:x:1005:1005::/home/user2:/bin/bash

tee把cat /etc/passwd输出的同时也将内容输出到文件55.txt
55.txt中包含了 cat /etc/passwd 的所有行

  • 参考传递Xargs
    xargs是给命令 传递参数 的一个过滤器,也是组合多个命令的一个工具。它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理。
    xargs 是一个强有力的命令,它能够捕获一个命令的输出,然后传递给另外一个命令,下面是一些如何有效使用xargs 的实用例子
[root@localhost ~]# touch  /home/file{1..5}     准备文件
[root@localhost ~]# ls /home
file1  file2  file3  file4  file5  ll  user1  user2
[root@localhost ~]# vim  files.txt   部分删除
[root@localhost ~]# cat  files.txt  |rm -rvf
[root@localhost ~]# cat  files.txt  
/home/file1       发现失败
/home/file3
/home/file5
[root@localhost ~]# cat  files.txt  |xargs     rm -rvf
已删除"/home/file1"    通过xargs成功连接rm命令
已删除"/home/file3"
已删除"/home/file5"
[root@localhost ~]# ls  /home
file2  file4  ll  user1  user2
[root@localhost ~]# 



猜你喜欢

转载自blog.csdn.net/m0_48654420/article/details/107696982