Linux I/O重定向

  • 标准输入(stdin):文件描述符0
  • 标准输入(stdout):文件描述符1
  • 标准错误(stderr):文件描述符2

file descriptors(FD,文件描述符 或 Process I/O channels);

进程使用文件描述符来管理打开的文件

[root@centos7- ~]# ls /proc/$$/fd
      

0, 1, and 2, known as standard input, standard output, and standard error

输出重定向(覆盖、追加)

  • 正确输出:1>  1>>  等价于 > >>
  • 错误输出:2>  2>>

输出重定向(覆盖)

[root@centos7- ~]# date > date.txt

输出重定向(追加)

[root@centos7- ~]# date >> date.txt

错误输出重定向

[root@centos7- ~]# ls /home/ /aaaa >list.txt
ls: 无法访问/aaaa: 没有那个文件或目录
[root@centos7- ~]# ls /home/ /aaaa >list.txt >err.txt      //重定向到不同的位置

正确和错误都输出到相同位置 &>

[root@centos7- ~]# ls /home/ /aaaa &>list.txt          //混合输出

正确和错误都输出到相同位置 2>&1

[root@centos7- ~]# ls /home/ /aaaa >list.txt >&        //重定向到相同的位置

重定向到空设备/dev/null

[root@centos7- ~]# ls /home/ /aaaa >list.txt >/dev/null     //空设备,即将产生的输出丢掉

[root@centos7- ~]# ls /home/ /aaaa &>/dev/null     //空设备,即将产生的输出丢掉

/dev/null 补充

/dev/null:是一个空设备,黑洞,任何文件都可以扔进去,但是看不见

如果/dev/null设备被删除怎么办? rm -f /dev/null

1、手动创建

# mknod -m  /dev/null c   
[root@centos7- ~]# ll /dev/null /dev/zero
crw-rw-rw- root root , 11月 : /dev/null
crw-rw-rw- root root , 11月 : /dev/zero
主设备号 从设备号
MAJOR MINOR

主设备号相同:表示为同一种设备类型,也可以认为keme使用的是相同的驱动

从设备号:在同一类型中的一个序号

[root@centos7- ~]# ll /dev/null /dev/vda1 /etc/hosts
crw-rw-rw- root root , 11月 : /dev/null
brw-rw---- root disk , 11月 : /dev/vda1
-rw-r--r--. root root 10月 : /etc/hosts
c表示字符设备

普通文件和设备文件的区别:

从表面上看,普通文件有大小;块设备文件没有大小,有主设备号和从设备号。

字符设备和快设备的区别:

字符设备没有缓存,块设备有缓存

脚本中使用重定向

案例1:脚本中使用重定向
# vim ping.sh
#!/usr/bin/bash
ping -c1 172.16.120.254 &>/dev/null
if [ $? -eq ];then
echo "up.."
else
echo "down.."
fi
# bash ping.sh 案例2:脚本中使用重定向
# vim ping2.sh
#!/usr/bin/bash
ping -c1 172.16.120.254 &>/dev/null
if [ $? -eq ];then
echo "172.16.120.254 up.." > /up.txt
else
echo "172.16.120.254 down.." >/down.txt
fi
# bash ping2.sh

示例

输入重定向

标准输入: <     等价于   0<

案例1

[root@centos7- ~]# mail -s "ssss" alice               //没有改变输入的方向,默认键盘

^D
[root@centos7- ~]# su - alice
[alice@centos7- ~]$ mail
Mail version 8.1 //. Type ? for help.
"/var/spool/mail/alice": message new
>N root@tianyun.local Mon Oct : / "ssss"
& [root@centos7- ~]# mail -s "test01" alice < /etc/hosts //输入重定向,来自于文件

案例2

[root@centos7- ~]# grep 'root'                         //没有改变输入的方向,默认键盘,此时等待输入...
yang sss
sssrootssss..
sssrootssss.. [root@centos7- ~]# grep 'root' < /etc/passwd
root:x:::root:/root:/bin/bash
operator:x:::operator:/root:/sbin/nologin

案例3

[root@centos7- ~]# dd if=/dev/zero of=/file1.txt bs=1M count=
[root@centos7- ~]# dd </dev/zero >/file2.txt bs=1M count=

案例4 mysql表结构导入

[root@centos7- ~]# mysql -uroot -p123 < bbs.sql

重定向综合案例

综合案例1:利用重定向建立多行的文件

[root@centos7- ~]# echo "" > file1.txt
[root@centos7- ~]# cat file1.txt [root@centos7- ~]# cat >file2.txt ^D
[root@centos7- ~]# cat file2.txt 请问:file2.txt有几行? [root@centos7- ~]# cat >>file3.txt
aaa
bbb
ccc
ddd
^D
[root@centos7- ~]# cat file3.txt 请问:file3.txt有几行? [root@centos7- ~]# cat >file4 <<EOF
>
>
>
> EOF
[root@centos7- ~]# cat file4

综合案例2: 脚本中利用重定向打印消息

[root@centos7- ~]# vim yang.sh
#!/usr/bin/bash
cat <<-EOF
+------------------------------------------------+
| |
| ====================== |
| 虚拟机基本管理centos |
| |
| ====================== |
| . 安装虚拟机 |
| . 重置所有Linux虚拟机 |
| . 重置Windows虚拟机 |
| . 重置Windows虚拟机 [完全] |
| . 重置指定的虚拟机 |
| q. 退出管理程序 |
| |
+------------------------------------------------+
EOF

综合案例3

[root@centos7- ~]# ls; date &>/dev/null          //希望两条命令输出都重定向

[root@centos7- ~]# ls &>/dev/null; date &>/dev/null

[root@centos7- ~]# (ls; date) &>/dev/null

[root@centos7- ~]# (while :; do date; sleep ; done) &    //在后台运行,但输出依然在终端显示

[root@centos7- ~]# (while :; do date; sleep ; done) &>date.txt &
[]
[root@centos7- ~]# tailf date.txt
Tue Apr :: CST
Tue Apr :: CST
Tue Apr :: CST
Tue Apr :: CST
Tue Apr :: CST
Tue Apr :: CST
Tue Apr :: CST
Tue Apr :: CST
Tue Apr :: CST [root@centos7- ~]# jobs
[]+ Running ( while :; do
date; sleep ;
done ) &>date.txt &
[root@centos7- ~]# kill %
[root@centos7- ~]# jobs

进程管道Piping

进程管道

用法:command1 | command2 | command3 |....

[root@centos7- ~]# ll /dev/ |less
[root@centos7- ~]# ps aux |grep 'sshd'
[root@centos7- ~]# rpm -qa |grep 'httpd' //查询所有安装的软件包,过滤包含httpd的包
[root@centos7- ~]# yum list |grep 'httpd'
  • 案例1:将/etc/password中的用户按UID大小排序

    [root@centos7- ~]# sort -t":" -k3 -n /etc/passwd   //以: 分隔,将第三列按字数升序
    [root@centos7- ~]# sort -t":" -k3 -n /etc/passwd -r //逆序
    [root@centos7- ~]# sort -t":" -k3 -n /etc/passwd |head -t 指定字段分隔符--field-separator
    -k 指定列
    -n 按数值
  • 案例2:统计出最占CPU的5个进程
    [root@centos7- ~]# ps aux --sort=-%cpu |head -
  • 案例3:统计当前/etc/password中用户使用的shell类型
    [root@centos7- ~]# awk -F: '{print $7}' /etc/passwd
    [root@centos7- ~]# awk -F: '{print $7}' /etc/passwd |sort
    [root@centos7- ~]# awk -F: '{print $7}' /etc/passwd |sort |uniq
    [root@centos7- ~]# awk -F: '{print $7}' /etc/passwd |sort |uniq -c
    /bin/bash
    /bin/sync
    /sbin/halt
    /sbin/nologin
    /sbin/shutdown
  • 案例4:统计网站的访问情况 top5
    [root@centos7- ~]# ss -an |grep : |awk -F":" '{print $8}' |sort |uniq -c
    192.168.0.66
    192.168.10.11
    192.168.10.125
    192.168.10.183
    192.168.10.213
    192.168.10.35
    192.168.10.39
    [root@centos7- ~]# ss -an |grep : |awk -F":" '{print $8}' |sort |uniq -c |sort -k1 -rn |head -n
  • 案例5:打印当前所有IP
    [root@centos7- ~]# ip addr |grep 'inet ' |awk '{print $2}' |awk -F"/" '{print $1}'
    192.168.122.205
  • 案例6:打印根分区已用空间的百分比(仅打印数字)
    [root@centos7- ~]# df -P  |grep '/$' |awk '{print $5}' |awk -F"%" '{print $1}'

tee管道

[root@centos7- ~]#  ip addr |grep 'inet ' |tee ip.txt |awk -F"/" '{print $1}' |awk '{print $2}'
127.0.0.1
192.168.122.205
[root@centos7- ~]# cat ip.txt
inet 127.0.0.1/ scope host lo
inet 192.168.122.205/ brd 192.168.122.255 scope global eth0
[root@centos7- ~]# ip addr |grep 'inet ' |tee -a ip.txt |awk -F"/" '{print $1}' |awk '{print $2}'
127.0.0.1
192.168.122.205
[root@centos7- ~]# date |tee date.txt
2018年 11月 07日 星期三 :: CST
[root@centos7- ~]# cat date.txt
2018年 11月 07日 星期三 :: CST

参数传递Xargs

awk sed grep sort uniq less more xargs
xargs: ls cp rm

  • 案例1

    [root@localhost ~]# touch /home/file{..}
    
    [root@localhost ~]# vim files.txt
    /home/file1
    /home/file2
    /home/file3
    /home/file4
    /home/file5 [root@localhost ~]# cat files.txt |ls -l
    [root@localhost ~]# cat files.txt |rm -rvf cont.
    [root@localhost ~]# cat files.txt |xargs ls -l
    -rw-r--r--. root root Mar : /home/file1
    -rw-r--r--. root root Mar : /home/file2
    -rw-r--r--. root root Mar : /home/file4
    -rw-r--r--. root root Mar : /home/file5 [root@localhost ~]# cat files.txt |xargs rm -rvf
    removed ‘/home/file1’
    removed ‘/home/file2’
    removed ‘/home/file4’
    removed ‘/home/file5’
  • 案例2
    [root@localhost ~]# touch /home/file{..}
    [root@localhost ~]# cat files.txt |xargs -I {} ls -l {}
    -rw-r--r--. root root Mar : /home/file1
    -rw-r--r--. root root Mar : /home/file2
    -rw-r--r--. root root Mar : /home/file4
    -rw-r--r--. root root Mar : /home/file5 [root@localhost ~]# cat files.txt |xargs -I {} cp -rvf {} /tmp
    ‘/home/file1’ -> ‘/tmp/file1’
    ‘/home/file2’ -> ‘/tmp/file2’
    ‘/home/file4’ -> ‘/tmp/file4’
    ‘/home/file5’ -> ‘/tmp/file5’ [root@localhost ~]# cat files.txt |xargs -I YANG cp -rvf YANG /var/tmp
    ‘/home/file1’ -> ‘/var/tmp/file1’
    ‘/home/file2’ -> ‘/var/tmp/file2’
    ‘/home/file4’ -> ‘/var/tmp/file4’
    ‘/home/file5’ -> ‘/var/tmp/file5’
  • 案例3
    [root@localhost ~]# find /etc -iname "*ifcfg*" |xargs -I {} cp -rf {} /tmp

Linux-I/O重定向和管道的更多相关文章

  1. linux输入输出、重定向、管道

    本篇讲述linux系统的输入输出.管道和重定向. 1. liunx的输入输出 一个linux系统要想发挥作用,就要有输入输出,这样才可以与外界交互. 类型 设备文件名 文件描述符 设备名称 说明 备注 ...

  2. LINUX常用命令--重定向、管道篇(四)

    一.Linux重定向 重定向能够实现Linux命令的输入输出与文件之间重定向,以及实现将多个命令组合起来实现更加强大的命令.这部分涉及到的比较多的命令主要有: 涉及到的比较多的命令主要有: cat:连 ...

  3. linux——(8)数据流重定向、管道命令

    概念一:数据流重定向 数据流分输入流和输出流,还有一个标准错误流,负责管理出错信息,比如一般的命令的输出会输出到屏幕上,我们可以用重定向让他输入到某个文件内. 相关操作: 1,标准输入(stdin): ...

  4. linux I/O重定向及管道

    一,I/O重定向 重定向正常输出 > :覆盖以存在文件的内容,很危险的操作 >>:如果文件已经存在,则是在原内容的最后追加. 可以禁止>的覆盖行为,使用set -C.只在当前会 ...

  5. Linux Shell 重定向与管道【转帖】

    by 程默 在了解重定向之前,我们先来看看linux 的文件描述符. linux文件描述符:可以理解为linux跟踪打开文件,而分配的一个数字,这个数字有点类似c语言操作文件时候的句柄,通过句柄就可以 ...

  6. Linux 入门记录:十六、Linux 多命令协作:管道及重定向

    一.多命令协作 在 Linux 系统当中,大多数命令都很简单,很少出现复杂功能的命令,每个命令往往只实现一个或多个很简单的功能.通过将不同功能的命令组合一起使用,可以实现某个复杂功能的. Linux ...

  7. 【Linux】【专项突破】Linux重定向与管道

    [专项突破]Linux重定向与管道 This article is written by Xrilang(Chinese Name:萌狼蓝天) If you want find me ,You can ...

  8. Linux I/O 重定向详解及应用实例

    Linux I/O 重定向详解及应用实例 简解 > 输出 < 输入 >> 追加 & [> | < | >>]之前:输入输出; ls /dev & ...

  9. linux 标准输入输出 重定向

    背景: 屏幕打印不一定都是从标准输出来的,也包括标准错误输出流stderr中的信息 文件描述符定义(系统定义了12个) 0 标准输入 1 标准输出 2 标准错误   0 默认键盘输入 1,2默认从屏幕 ...

随机推荐

  1. jQuery(一)、核心

    我认为,学习一门语言,主要是掌握它的思想与用途,就好比谈恋爱一样,你只要猜测到了对方的想法,就能够知情达意.废话不多说,我们开始今天学习的进度,加油ヾ(◍°∇°◍)ノ゙ 1. jQuery([sele ...

  2. Java开发相关的linux一些基础命令,必须要掌握的

      1.查找文件 find / -name filename.txt 根据名称查找/目录下的filename.txt文件. find . -name "*.xml" 递归查找所有的 ...

  3. Java学习点滴——初识Java

    基于<Java编程思想>第四版 前言 "程序就是算法加数据结构",而算法就是控制语句加操作符,编写一个程序就是使用控制语句加操作符去操作数据结构,因此我从Java的控制 ...

  4. 关于TCP的握手与挥手-----简单解释

    所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立.在socket编程中,这一过程由客户端执行conn ...

  5. Ajax常见面试题

    1,什么是ajax? 为什么要使用ajax? 1.ajax是"asynchornous javascript and xml "的缩写,指一种创建交互式网页应用的网页开发技术. 2 ...

  6. Spinner之下拉多选,监听ID后显示不同Frgment页面

    本人安卓小白,公司最近项目需要用到不同的类型的用户注册,周末下午写完记录一下. 网上找了一堆没有适合自己的(或者说我没找到),写的比较基础,欢迎大家多多指导. 老规矩,先上效果图 网上在线合成的GIF ...

  7. SQLServer之多表联合查询

    多表联合查询简介 定义:连接查询是关系型数据库最主要的查询,通过连接运算符可以实现多个表连接数据查询. 分类:内连接,外连接,全外连接. 内连接 定义 内联接使用比较运算符根据每个表的通用列中的值匹配 ...

  8. Linux(一)—— Unix&Linux 历史

    Linux(一)-- Unix&Linux 历史 Unix =Unix内核+Unix实用工具 Unix Unix 的诞生 Unix的历史可以追溯到20世纪60年代中期,当时麻省理工学院,AT& ...

  9. composer在update时提示file could not be downloaded: SSL operation failed with code 1. OpenSSL Error messages: error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO

    在开发的时候,需要把依赖的服务更新到最新,然后 手动composer update一下,提示如下: failed) Update failed (The "e "https://a ...

  10. Doctype知识点总结

    DOCTYPE是document type (文档类型) 的缩写.<!DOCTYPE >声明位于文档的最前面,处于标签之前,它不是html标签.主要作用是告诉浏览器的解析器使用哪种HTML ...