|
11、管道及I/O重定向
2021年07月13日 |
|
11.1 I/O以及I/O重定向 11.1.1 默认输入输出设备及程序运行流程简介 管道和重定向:> < >> << 计算机5大部件: 运算器、控制器: CPU 存储器:RAM 输入设备/输出设备 程序:指令和数据(放于存储器中) 控制器:读取指令,并读取需要的运算 运算器:在控制器的控制线进行运算 存储器:运算结果存储在存储器中 三大总线: 地址总线:内存寻址 数据总线:传输数据 控制总线:控制指令 寄存器:CPU暂时存储器 I/O设备(输入输出设备): 硬盘,键盘,鼠标 程序运行时会使用默认的输入输出设备:INPUT设备,OUTPUT设备 系统设定的默认输入输出设备 默认输出设备:标准输出,STDOUT, 1 默认输入设备:标准输入, STDIN, 0 标准错误输出:STDERR, 2 对于计算机来说: 标准输入:键盘 标准输出和错误输出:显示器(因为廉价,可以输出无限的东西) passwd –stdin(获取标准输入为密码) 11.1.2 I/O重定向 I/O重定向:将默认的输入输出来源改变为自己设定的内容 [root@Daniel-R480 ~]# ls /var adm crash empty gopher lib lock mail opt run tmp cache db games kerberos local log nis preserve spool yp [root@Daniel-R480 ~]# ls /var >/var/var.out [root@Daniel-R480 ~]# vim /var/var.out [root@Daniel-R480 ~]# cat /var/var.out adm cache crash db empty 1、输出重定向 Linux: (1)标准输出重定向 >: 覆盖输出,覆盖原有的文件 >>:追加输出 set -C: 禁止对已经存在文件使用覆盖重定向; 强制覆盖输出,则使用 >| set +C: 关闭上述功能 (2)错误输出重定向 2>: 重定向错误输出 2>>: 追加方式 [root@Daniel-R480 ~]# ls /varr > /tmp/var.out 2> /tmp/err.out [root@Daniel-R480 ~]# cat /tmp/err.out ls: cannot access /varr: No such file or directory [root@Daniel-R480 ~]# (3)标准和错误输出同时重定向 &>: 重定向标准输出或错误输出至同一个文件 [root@Daniel-R480 ~]# ls /varr &> /tmp/var.out [root@Daniel-R480 ~]# cat /tmp/var.out ls: cannot access /varr: No such file or directory [root@Daniel-R480 ~]# 2、输入重定向 <:输入重定向 <<:Here Document,在此处生成文档 [root@Daniel-R480 ~]# cat << END > 123 > 234 > END 123 234 [root@Daniel-R480 ~]# [root@Daniel-R480 ~]# cat << EOF > 123 > EOF 123 [root@Daniel-R480 ~]# cat >> ‘./test.txt’ << EOF > 123 > 234 > EOF [root@Daniel-R480 ~]# cat ./test.txt 123 234 [root@Daniel-R480 ~]# 3、管道 管道:前一个命令的输出,作为后一个命令的输入 命令1 | 命令2 | 命令3 | … tee :既显示输入的内容,又保存到文件中 [root@Daniel-R480 ~]# echo “hello world”| tee /tmp/hello.out hello world [root@Daniel-R480 ~]# cat /tmp/hello.out hello world [root@Daniel-R480 ~]# [root@Daniel-R480 ~]# wc -l /etc/passwd 32 /etc/passwd [root@Daniel-R480 ~]# wc -l /etc/passwd | cut -d’ ‘ -f1 32 [root@Daniel-R480 ~]# 练习: 1、统计/usr/bin/目录下的文件个数; # ls /usr/bin | wc -l [root@Daniel-R480 ~]# ls -l /usr/bin | wc -l 790 [root@Daniel-R480 ~]# ls -l /usr/bin | head -1 total 64504 [root@Daniel-R480 ~]# ls -l /usr/bin | head -2 total 64504 -rwxr-xr-x 1 root root 41544 Oct 31 2018 [ [root@Daniel-R480 ~]# ls -l /usr/bin | head -3 total 64504 -rwxr-xr-x 1 root root 41544 Oct 31 2018 [ -rwxr-xr-x 1 root root 107848 Feb 3 00:33 a2p [root@Daniel-R480 ~]# ls -l /usr/bin | head -4 total 64504 -rwxr-xr-x 1 root root 41544 Oct 31 2018 [ -rwxr-xr-x 1 root root 107848 Feb 3 00:33 a2p -rwxr-xr-x 1 root root 29200 Oct 30 2018 addr2line [root@Daniel-R480 ~]# ls -lh /usr/bin | head -1 total 64M [root@Daniel-R480 ~]# 2、取出当前系统上所有用户的shell,要求,每种shell只显示一次,并且按顺序进行显示; [root@Daniel-R480 ~]# cut -d: -f7 /etc/passwd | sort -u /bin/bash /bin/sh /bin/sync /sbin/halt /sbin/nologin /sbin/shutdown [root@Daniel-R480 ~]# 3、思考:如何显示/var/log目录下每个文件的内容类型? [root@Daniel-R480 ~]# file /var/log/* /var/log/anaconda: directory /var/log/audit: directory /var/log/boot.log: empty /var/log/btmp: empty /var/log/chrony: directory /var/log/cron: empty /var/log/grubby_prune_debug: ASCII text /var/log/lastlog: 8086 relocatable (Microsoft) /var/log/maillog: empty /var/log/messages: empty /var/log/qemu-ga: directory /var/log/rhsm: directory /var/log/secure: empty /var/log/spooler: empty /var/log/tallylog: empty /var/log/tuned: directory /var/log/wtmp: empty /var/log/yum.log: ASCII text [root@Daniel-R480 ~]# file `ls /var/log` anaconda: cannot open (No such file or directory) audit: cannot open (No such file or directory) boot.log: cannot open (No such file or directory) btmp: cannot open (No such file or directory) chrony: cannot open (No such file or directory) cron: cannot open (No such file or directory) grubby_prune_debug: cannot open (No such file or directory) lastlog: cannot open (No such file or directory) maillog: cannot open (No such file or directory) messages: cannot open (No such file or directory) qemu-ga: cannot open (No such file or directory) rhsm: cannot open (No such file or directory) secure: cannot open (No such file or directory) spooler: cannot open (No such file or directory) tallylog: cannot open (No such file or directory) tuned: cannot open (No such file or directory) wtmp: cannot open (No such file or directory) yum.log: cannot open (No such file or directory) [root@Daniel-R480 ~]# cd /var/log [root@Daniel-R480 log]# file `ls /var/log` anaconda: directory audit: directory boot.log: empty btmp: empty chrony: directory cron: empty grubby_prune_debug: ASCII text lastlog: 8086 relocatable (Microsoft) maillog: empty messages: empty qemu-ga: directory rhsm: directory secure: empty spooler: empty tallylog: empty tuned: directory wtmp: empty yum.log: ASCII text [root@Daniel-R480 log]# 4、取出/etc/inittab文件的第6行; [root@Daniel-R480 ~]# head -6 /etc/inittab | tail -1 # 5、取出/etc/passwd文件中倒数第9个用户的用户名和shell,显示到屏幕上并将其保存至/tmp/users文件中; [root@Daniel-R480 ~]# tail -9 /etc/passwd | head -1 | cut -d: -f1,7 | tee /tmp/users user9:/bin/bash 6、显示/etc目录下所有以pa开头的文件,并统计其个数; [root@Daniel-R480 ~]# ls -d /etc/pa* | wc -l 3 [root@Daniel-R480 ~]# 7、不使用文本编辑器,将alias cls=clear一行内容添加至当前用户的.bashrc文件中; [root@Daniel-R480 ~]# echo “alias cls=clear” >> ~/.bashrc [root@Daniel-R480 ~]# cat ~/.bashrc # .bashrc # User specific aliases and functions alias rm=’rm -i’ alias cp=’cp -i’ alias mv=’mv -i’ # Source global definitions if [ -f /etc/bashrc ]; then . /etc/bashrc fi alias cls=clear [root@Daniel-R480 ~]# |