首先要知道的3种I/O设备,然后把I/O重定向入文件中,然后用管道将命令链接起来,用tr命令进行转换,tee重定向到多个目标。
程序=指令+数据
Linux给程序提供三种I/O设备 – 标准输入(STDIN)
-0 默认接受来自键盘的输入 – 标准输出(STDOUT)
-1 默认输出到终端窗口 – 标准错误(STDERR)
-2 默认输出到终端窗口
解释:命令 passwd 从标准输入读取用户密码,所以用户可以用键盘输入密码
命令 echo 把结果输出到标准输出,所以可以在屏幕上看到结果
普通用户没有权限查看/root 目录,所以出错,于是 ls 把错误信息输出到标准错误,也就是屏幕
一、I/O重定向就是改变默认的位置,把输出和错误重新定向到文件中:命令 操作符号 文件名
1. 输入重定向:
(1)从文件中导入STDIN,某些命令能够接受从文件中导入的STDIN
tr ‘a-z’ ‘A-Z’</etc/issue
该命令会把/etc/issue中的小写字符都转换成大写字符
tr –d abc < /etc/fstab 删除fstab文件中的所有abc中任意字
(2)cat >test.txt
进行键盘输入
结束ctrl+d[root@centos6-magedu ~]# cat >test.txt
hello world(3)多行重定向:使用“<<终止词”命令从键盘把多行重导向给STDIN
– 直到 终止词 位置的所有文本都发送给STDIN
– 有时被称为就地文本(heretext)
[root@centos6-magedu ~]# cat>test.txt<<END
> Goodmorning! > Everyone > how are you > i'm fine > END(4)邮件收发功能:
发送方:mail –s 邮件名 发送方<<END
[root@centos6-magedu ~]# mail -s help root>>END
HELLO,i,^H'fbc dcn END接收方:mail
第几封邮件
save保存 quit2. 输出重定向
(1)> 或 1> 表示正确输出重定向
> 若文件不存在,则创建,若文件已存在,则覆盖 >> 若文件不存在,则创建,若文件已存在,则追加 ( 2) 2> 表示错误输出重定向 2> 若文件不存在,则创建,若文件已存在,则覆盖 2>> 若文件不存在,则创建,若文件已存在,则追加 (3) &> 表示全部输出重定向(正确错误都定向) &> 若文件不存在,则创建,若文件已存在,则覆盖 &>> 若文件不存在,则创建,若文件已存在,则追加(4)1>&2 表示将正确结果转换为错误结果
2>&1 表示将错误结果转换为正确结果3 .重定向到多个目标(tee)
命令1 | tee[-a ] 文件名| 命令2 把命令1的STDOUT保存在文件中,做为命令2的输入 -a 追加 使用: –保存不同阶段的输出 –复杂管道的故障排除 –同时查看和记录输出 4. /dev/null(黑洞 垃圾桶)重定向到该文件的数据都被内核丢掉了,可以用这个特性来屏蔽某些输出信息
# echo hello world > /dev/null
--屏蔽掉命令的出错信息
# ls / /root 2> /dev/null
set -C 禁止覆盖
>| 临时强制覆盖 set +C 允许覆盖5. 标准输入输出的深入探讨
标准的输入输出是Linux 默认为程序创建好的三个文件描述符,虽然大多数的程序都会使用这三个文件描述符来作为自己的输入输出,但是这并非是强制性的,也就是说,程序可以不使用这三个标准的文件描述符,而是自己打开新的文件描述符来使用。当程序不使用标准的输入输出时,这里所使用的重定向对其也就不起作用了。例如:
passwd: 程序从标准输入读取用户密码,因此我们可以通过重定向标准输入来向它提供密码
ssh: 命令是用于远程登录的程序,它读取用户输入的密码时,使用的不是标准输入,因此我们不能通过重定向标准输入来向它提供密码
二、管道(P)
上面所描述的重定向,是把标准的输入输出连接到文件。我们也可以把多个程序之间的标准输入输出进行连接,实现命令之间数据的传递,这种技术被形象地称做管道,程序的输出就像流水在管道中流通一样,从最左边的程序流到最右边的程序。管道是linux shell 里非常常见的技术,利用管道技术可以达到配合使用多个小工具,完成非常复杂而强大的功能。如希望错误的也可以传递,则需要先将错误结果转为正确结果 2>&1 | 或 |&.
- 符号
• 示例: 将 /home 里面的文件打包,但打包的数据不是记录到文件,而是传送到 stdout,经过管道后,将 tar -cvf - /home 传送给后面的 tar -xvf - , 后面的这个 - 则是取前一个命令的 stdout, 因此,就不 需要使用临时file了• tar -cvf - /home | tar -xvftr (转换和删除字符 )
选项:
-c –C --complement:取字符集的补集
-d --delete:删除所有属于第一字符集的字符
‘\n’换行
‘\n’ ‘ ‘竖直转换为水平
-cd a 只保留a
-s --squeeze-repeats:把连续重复的字符以单独一个字符表示
-t --truncate-set1:将第一个字符集对应字符转化为第二字符集对应的字符
[:alnum:]:字母和数字
[:alpha:]:字母
[:cntrl:]:控制(非打印)字符
[:digit:]:数字
[:graph:]:图形字符
[:lower:]:小写字母
[:print:]:可打印字符
[:punct:]:标点符号
[:space:]:空白字符
[:upper:]:大写字母
[:xdigit:]:十六进制字符
less: 一页一页地查看输入 ,用法同man
ls -l /etc | less • mail:
通过电子邮件发送输入
echo "testemail"| mail -s "test"
1、将/etc/issue文件中的内容转换为大写后保存至/tmp/issue.out文件中
[root@localhost ~]#tr [:lower:] [:upper:] /tmp/issue.out [root@localhost ~]#cat /tmp/issue.out \S KERNEL \R ON AN \M cat /etc/issue|tr a-z A-Z/tmp/issue.out
2、将当前系统登录用户的信息转换为大写后保存至/tmp/who.out文件中
[root@localhost ~]#who |tr [:lower:] [:upper:]> /tmp/who.out [root@localhost ~]#cat /tmp/who.out ROOT :0 2018-07-16 20:22 (:0) ROOT TTY3 2018-07-16 20:23 ROOT PTS/0 2018-07-16 20:24 (172.18.250.74) ROOT PTS/1 2018-07-16 20:25 (172.18.250.74)
3、一个linux用户给root发邮件,要求邮件标题为”help”,邮件正文如下:
Hello, I am 用户名,The system version is here,please help me to check it ,thanks 操作系统版本信息
法一 :
[root@localhost ~]#useradd zs[root@localhost ~]#su - zs [zs@localhost ~]$ mail -s "help" root<Hello,I am $USER,The system version is here,please help me to check it,thanks `cat /etc/redhat-release` > END
法二:
[root@localhost ~]# ( echo "Hello, I am $USER,The system version is here,please help me to check it ,thanks" ;cat /etc/redhat-release ) |mail -s help root
4、将/root/下文件列表,显示成一行,并文件名之间用空格隔开
[root@localhost ~]# ls /root/ |tr '\n' ' 'a anaconda-ks.cfg Desktop Documents Downloads fion.jk fion.ubyv fion.yv hi initial-setup-ks.cfg ls mail mbox Music Pictures Public rgn Templates testdir Videos
5、计算1+2+3+..+99+100的总和
echo {1..100} |tr ' ' '+' |bc
6、删除Windows文本文件中的‘^M’字符
[root@localhost ~]# tr -d '\015' < win.txt > win1.txt [root@localhost ~]# cat -A win1.txt A$ B$ C$ [root@localhost ~]# cat -A win.txt A^M$ B^M$ C^M$
7、处理字符串“xt.,l 1 jr#!$mn2 c*/fe3 uz4”,只保留其中的数字和空格
[root@localhost ~]# echo 'xt.,l 1 jr#!$mn2 c*/fe3 uz4' |tr -cd '0-9 '1 2 3 4[root@localhost ~]#
8、将PATH变量每个目录显示在独立的一行
[root@localhost ~]# echo $PATH |tr : '\n' /usr/local/sbin /usr/local/bin /usr/sbin /usr/bin /root/bin
9、将指定文件中0-9分别替代成a-j
[root@localhost ~]# cat linux.txt|tr [0-9] 'a-j'efbuv befurvj jjiggb hfruf
10、将文件中每个单词(由字母组成)显示在独立的一行,并无空行
cat test.txt |tr '[:punct:]' '\n' |tr ' ' '\n'