Linux 系统管理-输入输出

一、重定向概述

1. 什么是重定向
将原本要输出到屏幕的数据信息,重新定向到某个指定的文件中,或者从一个重定向的位置读取信息。
2.为什么使用重定向
  • 1.当屏幕输出的信息很重要,而且希望保存重要的信息时;
  • 2.后台执行中的程序,不希望他干扰屏幕正常的输出结果时;
  • 3.系统的例行命令, 例如定时任务的执行结果,希望可以存下来时;
  • 4.一些执行命令,我们已经知道他可能出现错误信息, 想将他直接丢弃时;
  • 5.错误日志与正确日志需要分别输出至不同的文件保存时;

3.重定向的基本知识

名称 文件描述符 作用
标准输入(STDIN) 0 默认输入是键盘,也可以是文件或其他命令的输出
标准输出(STDOUT) 1 默认输出到屏幕
错误输出(STDERR) 2 默认输出到屏幕

下面是一些输入输出的过程

#输入与输出过程
[root@whb ~]# cat 
oldboy #标准输入,没有指定文件时,默认从键盘中读取数据 
oldboy #标准输出,将你标准输入的结果进行标准输出到屏幕上面

#查看程序的进行过程中产生的一些文件
[root@whb ~]# tail  -f   /var/log/messages
Dec 19 15:01:01 qls systemd: Created slice User Slice of root.
Dec 19 15:01:01 qls systemd: Started Session 538 of user root.
Dec 19 15:01:01 qls systemd: Removed slice User Slice of root.
Dec 19 16:01:01 qls systemd: Created slice User Slice of root.
Dec 19 16:01:01 qls systemd: Started Session 539 of user root.
Dec 19 16:01:01 qls systemd: Removed slice User Slice of root.
Dec 19 16:20:36 qls systemd: Created slice User Slice of yuwei.
Dec 19 16:20:36 qls systemd: Started Session 540 of user yuwei.
Dec 19 16:20:36 qls systemd-logind: New session 540 of user yuwei.
Dec 19 16:20:42 qls su: (to root) yuwei on pts/0

^Z
[1]+  Stopped                 tail -f /var/log/messages

二、输出重定向

作用:将输出的结果重定向到一个指定的位置中(不管正确的信息或者错误的信息)
类型 符号 用途
标准覆盖输出重定向 > 将程序输出的正确结果输出到指定的文件中,会覆盖文件原有的内容
标准追加输出重定向 >> 将程序输出的正确结果以追加的方式输出到指定文件,不会覆盖原有文件
标准错误覆盖输出重定向 2> 将程序的错误结果输出到执行的文件中,会覆盖文件原有的内容
标准错误追加输出重定向 2>> 将程序输出的错误结果以追加的方式输出到指定文件,不会覆盖原有文件
演示案例:
实例1:标准输出重定向
[root@whb ~]# echo  hello > file1.txt
[root@whb ~]# cat file1.txt
hello
[root@whb ~]# cat file1.txt  /etc/passwd  > file2.txt
[root@whb ~]# cat file2.txt
hello
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@whb ~]# cat >> file3.txt
linux
centos
^C
[root@whb ~]# cat file3.txt 
linux
centos
实例2:标准输出追加重定向
[root@whb ~]# echo 'test' >> file1.txt 
[root@whb ~]# cat file1.txt
hello
test
实例3:标准错误输出重定向
[root@whb ~]# ls /rttt > file5.txt 
ls: cannot access /rttt: No such file or directory
[root@whb ~]# cat file5.txt
[root@whb ~]# ls /rttt 2> file5.txt      
[root@whb ~]# cat  file5.txt
ls: cannot access /rttt: No such file or directory
[root@whb ~]# ls /root 2> file5.txt 
file1.txt  file2.txt  file3.txt  file4.txt  file5.txt
实例4:标准错误输出追加重定向

[root@whb ~]# ls /rttt 2>> file5.txt 
[root@whb ~]# cat file5.txt
ls: cannot access /rttt: No such file or directory
ls: cannot access /rttt: No such file or directory
[root@whb ~]# ls /rttt 2>> file5.txt 
[root@whb ~]# cat file5.txt
ls: cannot access /rttt: No such file or directory
ls: cannot access /rttt: No such file or directory
ls: cannot access /rttt: No such file or directory
[root@whb ~]# ls /root 2>> file5.txt 
file1.txt  file2.txt  file3.txt  file4.txt  file5.txt
[root@whb ~]# cat file5.txt
ls: cannot access /rttt: No such file or directory
ls: cannot access /rttt: No such file or directory
ls: cannot access /rttt: No such file or directory
实例5:将错误和正确的都重定向到一个文件中

[root@whb ~]# ll /ias > test.txt 2>&1      #比较原始的用法,与&>结果相同
[root@whb ~]# cat test.txt 
ls: cannot access /ias: No such file or directory
[root@whb ~]# ll /iis &> test.txt
[root@whb ~]# cat test.txt 
ls: cannot access /iis: No such file or directory
[root@whb ~]# ll / -d &> test.txt 
[root@whb ~]# cat test.txt 
drwxr-xr-x. 22 root root 4096 Dec 19 15:50 /

#也可以使用追加的方式把错误和正确的信息都输入在同一个文件中
[root@whb ~]# ls abc &>> test.txt 
[root@whb ~]# cat test.txt 
drwxr-xr-x. 22 root root 4096 Dec 19 15:50 /
ls: cannot access abc: No such file or directory
案例6: 将输出的信息定向到空
[root@whb ~]# ls  /root >/dev/null
[root@whb ~]# cat /dev/null
[root@whb ~]# ls  /rtt  2>/dev/null
实例7: 将正确的输出信息和错误的输出信息重定向不同的文件中

[root@whb ~]# ls  /opt/  >file7.txt 2>file8.txt
[root@whb ~]# rm -rf  /opt/
[root@whb ~]# ls  /opt/  >file7.txt 2>file8.txt
[root@whb ~]# cat file7.txt 
[root@whb ~]# cat file8.txt 
ls: cannot access /opt/: No such file or directory

[root@whb ~]# ls  /opt/  >>file7.txt 2>>file8.txt
[root@whb ~]# rm -rf /opt/
[root@whb ~]# ls  /opt/  >>file7.txt 2>>file8.txt
[root@whb ~]# cat file7.txt 
services
[root@whb ~]# cat file8.txt 
ls: cannot access /opt/: No such file or directory
ls: cannot access /opt/: No such file or directory
实例8:多条命令的输出结果到文件中
[root@whb ~]# ls 
access.log  catweb.log  etc.zip  httpd-2.4.41.tar.gz  secure.log  sort.log  test  test.txt
[root@whb ~]# ls ; ls /mnt/ > file1.txt
access.log  catweb.log  etc.zip  httpd-2.4.41.tar.gz  secure.log  sort.log  test  test.txt
[root@whb ~]# ls /mnt/
cdrom  swapfile2
[root@whb ~]# cat file1.txt 
cdrom
swapfile2

实例9:脚本中使用重定向
[root@whb ~]# cat test.sh
#!/bin/bash
ping  -c1  www.baidu.com

if [ $? -eq 0 ];then
	echo "网络是通畅的....."
else
	echo "网络是不通的....."
fi
[root@whb ~]# ./test.sh 
PING www.a.shifen.com (180.101.49.12) 56(84) bytes of data.
64 bytes from 180.101.49.12 (180.101.49.12): icmp_seq=1 ttl=128 time=17.8 ms

--- www.a.shifen.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 17.818/17.818/17.818/0.000 ms
网络是通畅的.....

[root@whb ~]# cat test.sh
#!/bin/bash
ping  -c1  www.baidu.com &>/dev/null

if [ $? -eq 0 ];then
	echo "网络是通畅的....."
else
	echo "网络是不通的....."
fi
[root@whb ~]# ./test.sh 
网络是通畅的.....

三、输入重定向

作用:输入重定向,即原本从键盘等上获得的输入信息,重定向由命令的输出作为输入。< 等价 0<
标准输入重定向 < 将命令中接收输入的途径由默认的键盘更改为指定的文件或命令
标识符限定输入重定向 << 命令从标准输入中读入内容,直到遇到"标识符"分解符为止
演示案例:
[root@whb ~]# cat < file1.txt 
hello
test
file1.txt
file2.txt
file3.txt
file4.txt
[root@whb ~]# cat 
root
root
^C
[root@whb ~]# tr  'f'  'F'   #交互式输入信息
file
File
^C
[root@whb ~]# tr  'f'  'F'  <  file1.txt      
hello
test
File1.txt
File2.txt
File3.txt
File4.txt

[root@whb ~]# grep  'root' <  /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@whb ~]# grep  'root'   #交互式输入信息,过滤内容
oldboy
root
root
rootttt
rootttt
实例2:数据库中导入库或者表,恢复数据

[root@whb ~]# mysql  -uroot -p123  < database.sql
实例3:生成一个文件
[root@whb ~]# dd  if=/dev/zero  of=/root/test.log  bs=10M  count=100
100+0 records in
100+0 records out
1048576000 bytes (1.0 GB) copied, 27.5536 s, 38.1 MB/s
[root@whb ~]# ll -h
total 1001M
-rw-r--r--. 1 root root 1000M Dec 19 18:27 test.log
-rwxr-xr-x. 1 root root   143 Dec 19 17:38 test.sh
[root@whb ~]# dd  </dev/zero >/root/test.txt  bs=10M count=10
10+0 records in
10+0 records out
104857600 bytes (105 MB) copied, 11.6617 s, 9.0 MB/s
[root@whb ~]# ll -h
total 1.1G
-rw-r--r--. 1 root root 1000M Dec 19 18:27 test.log
-rwxr-xr-x. 1 root root   143 Dec 19 17:38 test.sh
-rw-r--r--. 1 root root  100M Dec 19 18:28 test.txt
这里用到了 dd 命令,这里简单介绍下用法和几个简单的选项
dd    #用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。
使用方式:
dd [option]
if            #从哪里读取数据
of           #输出到哪里
bs          #一次输出多少
count     #输出的次数

[root@whb ~]# dd  if=/dev/zero  of=/root/test.log  bs=10M  count=100
100+0 records in
100+0 records out
1048576000 bytes (1.0 GB) copied, 27.5536 s, 38.1 MB/s
[root@whb ~]# ll -h
total 1001M
-rw-r--r--. 1 root root   143 Dec 19 17:34 file10.txt
-rw-r--r--. 1 root root    51 Dec 19 17:12 file1.txt
-rw-r--r--. 1 root root  2.2K Dec 19 17:05 file2.txt
-rw-r--r--. 1 root root   102 Dec 19 17:30 file8.txt
-rw-r--r--. 1 root root   174 Dec 19 17:33 file9.txt
-rw-r--r--. 1 root root 1000M Dec 19 18:27 test.log
-rwxr-xr-x. 1 root root   143 Dec 19 17:38 test.sh
[root@whb ~]# dd  /root/test.txt  bs=10M count=10
10+0 records in
10+0 records out
104857600 bytes (105 MB) copied, 11.6617 s, 9.0 MB/s
[root@whb ~]# ll -h
total 1.1G
-rw-r--r--. 1 root root   143 Dec 19 17:34 file10.txt
-rw-r--r--. 1 root root    51 Dec 19 17:12 file1.txt
-rw-r--r--. 1 root root  2.2K Dec 19 17:05 file2.txt
-rw-r--r--. 1 root root   174 Dec 19 17:33 file9.txt
-rw-r--r--. 1 root root 1000M Dec 19 18:27 test.log
-rwxr-xr-x. 1 root root   143 Dec 19 17:38 test.sh
-rw-r--r--. 1 root root  100M Dec 19 18:28 test.txt
实例4:标准输入限定标识符重定向

[root@whb ~]# cat >new.txt<<EOF
> oldboy
> oldgirl
> EOF
[root@whb ~]# cat new.txt 
oldboy
oldgirl
实例5:脚本中使用标准输入限定标识符重定向
脚本中打印菜单

[root@whb ~]# cat ./test.sh
#!/bin/bash
cat <<EOF
1.ping主机10.0.0.100
2.ping主机10.0.0.200
EOF


ping  -c1  www.baidu.com &> /dev/null

if [ $? -eq 0 ];then
	echo "网络是通畅的....."
else
	echo "网络是不通的....."
fi

四、管道技术

作用:将左侧的命令的输出结果作为右侧命令的标准输入进行处理,不会把错误的信息传递过去

管道操作符号 "|"
使用格式 cmd1 | cmd2 | cmd3 ......

[root@whb ~]# cut  -d ":"  -f3  /etc/passwd | sort -rn
2022
2021
2020
2019

[root@whb ~]# cut  -d ":" -f7  /etc/passwd | sort  | uniq -c | sort -rn
     28 /bin/bash
     19 /sbin/nologin
      1 /sbin/shutdown
      1 /sbin/halt
      1 /bin/sync

[root@whb ~]# ip a s eth0
2: eth0: <broadcast,multicast,up,lower_up> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:ae:0b:8a brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.100/24 brd 10.0.0.255 scope global noprefixroute eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::c653:602a:38c6:e45/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
[root@whb ~]# ip a s eth0 | grep -w inet
    inet 10.0.0.100/24 brd 10.0.0.255 scope global noprefixroute eth0
[root@whb ~]# ip a s eth0 | grep -w inet | cut -d " " -f6
10.0.0.100/24
[root@whb ~]# ip a s eth0 | grep -w inet | cut -d " " -f6 | cut -d "/" -f1
10.0.0.100</broadcast,multicast,up,lower_up>

管道技术中的tee技术
作用:将输出结果输出到屏幕的同时,也会输出到一个指定的文件中
-a #追加
[root@whb ~]# ip a s eth0 | grep -w inet | cut -d " " -f6 | cut -d "/" -f1 | tee  ip.txt
10.0.0.100
[root@whb ~]# cat ip.txt
10.0.0.100
[root@whb ~]# ip a s eth0 | grep -w inet | cut -d " " -f6 | cut -d "/" -f1 > ip.txt
[root@whb ~]# cat ip.txt
10.0.0.100
[root@whb ~]# echo $RANDOM|md5sum | cut -c 1-10
2139cee1fc
[root@whb ~]# echo $RANDOM|md5sum | cut -c 1-10 |passwd --stdin  user06
Changing password for user user06.
passwd: all authentication tokens updated successfully.
[root@whb ~]# echo $RANDOM|md5sum | cut -c 1-10 |tee  pass.txt  |passwd --stdin  user06
Changing password for user user06.
passwd: all authentication tokens updated successfully.
[root@whb ~]# echo $RANDOM|md5sum | cut -c 1-10 |tee  |passwd --stdin  user06
Changing password for user user06.
passwd: all authentication tokens updated successfully.
[root@whb ~]# echo $RANDOM|md5sum | cut -c 1-10 |tee  pass.txt 
c3d3da1a5e
[root@whb ~]# echo $RANDOM|md5sum | cut -c 1-10 |tee -a   pass.txt 
a026eeb93c
[root@whb ~]# cat pass.txt
c3d3da1a5e
a026eeb93c

xargs
       将一些不支持管道命令支持管道,默认管道是将左侧的输出结果标准输入到右侧的命令,主要是针对数据操作,xargs可以让这些数据交给右侧命令当做是针对文件操作。
.
实例:将当前目录下的所有.txt类型的文件复制到/opt目录下
方法一:通过xargs实现
[root@whb ~]# find  ./  -name "*.txt"  |xargs   cp -t  /opt   
[root@whb ~]# ll /opt
total 40
-rw-r--r--. 1 root root 8 Dec 19 19:15 file10.txt
-rw-r--r--. 1 root root 8 Dec 19 19:15 file1.txt
-rw-r--r--. 1 root root 8 Dec 19 19:15 file2.txt
-rw-r--r--. 1 root root 8 Dec 19 19:15 file3.txt
-rw-r--r--. 1 root root 8 Dec 19 19:15 file4.txt
-rw-r--r--. 1 root root 8 Dec 19 19:15 file5.txt
-rw-r--r--. 1 root root 8 Dec 19 19:15 file6.txt
-rw-r--r--. 1 root root 8 Dec 19 19:15 file7.txt
-rw-r--r--. 1 root root 8 Dec 19 19:15 file8.txt
-rw-r--r--. 1 root root 8 Dec 19 19:15 file9.txt

方法二:通过$()实现
[root@whb ~]# cp  $(find  ./  -name "*.txt")  /opt/
[root@whb ~]# ll /opt/
total 40
-rw-r--r--. 1 root root 8 Dec 19 19:17 file10.txt
-rw-r--r--. 1 root root 8 Dec 19 19:17 file1.txt
-rw-r--r--. 1 root root 8 Dec 19 19:17 file2.txt
-rw-r--r--. 1 root root 8 Dec 19 19:17 file3.txt
-rw-r--r--. 1 root root 8 Dec 19 19:17 file4.txt
-rw-r--r--. 1 root root 8 Dec 19 19:17 file5.txt
-rw-r--r--. 1 root root 8 Dec 19 19:17 file6.txt
-rw-r--r--. 1 root root 8 Dec 19 19:17 file7.txt
-rw-r--r--. 1 root root 8 Dec 19 19:17 file8.txt
-rw-r--r--. 1 root root 8 Dec 19 19:17 file9.txt

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注