重定向和管道
本章节内容:
三种I/O设备
把I/O频道重定向入
使用管道链接命令
一、标准输入和输出:
程序:指令+数据
读入数据:Input;输出数据:Output
打开的文件都有一个fd:file descriptor (文件描述符)
Linux给程序提供三种I/O设备:
标准输入(STDIN)-0默认接受来自键盘的输入
标准输出(STDOUT)-1默认输出到终端窗口
标准错误(STDERR)-2默认输出到终端窗口
I/O重定向:改变默认位置
不是所有的标准输入都有标准输出;标准输出是默认的当前终端窗口。
三种合并正常输出流和错误输出流的方法:
二、将输出和错误输出重新定向到文件:
标准输出和错误输出可以被重定向到文件:
命令操作符号文件名
支持的操作符号包括:
标准输出和错误输出可以各自定向至不同位置;
了解重定向的使用:
1、>把标准输出重定向到文件(文件内容会被覆盖);>>原有内容基础上,追加内容;
2、2>把错误输出重定向到文件;2>>:追加重定向错误输出数据流;
3、&>把合并所有输出重定向到文件;&>>:追加重定向
COMMAND > /path/to/file.out2> &1(顺序很重要)
COMMAND >> /path/to/file.out2>> &1
新的写法(&>),入下图:
以前旧的写法(2>&1),入下图:
禁止覆盖:(针对当前终端有效)
# set -C:禁止将内容覆盖已有文件,但可追加(>>)
强制覆盖:>|
# set +C:允许覆盖
4、合并多个程序执行的结果重定向,命令格式为:(COMMAND;COMMAND)> /path/filename
5、使用字符给系统用户写邮件,格式:# mail –s标题用户名
回车后,等待内容的输入,结束以“.”,切记.的前面不能够空格。
用户chesfer查看来自root用户发给其的邮件,如下图:
6、多行输入重定向的开始/结束符:<EOF
三、认识和使用tr命令:
tr–转换和删除字符
使用格式: tr[OPTION]...SET1 [SET2]
使用选项:-c或——complerment:取字符集的补集
-d或——delete:删除所有属于第一字符集的字符
-s或—squeeze-repeats:把连续重复的字符以单独一个字符表示
-t或--truncate-set1:将第一个字符集对应字符转化为第二字符集对应的字符
tr –c使用:如下图,将不是a和b的字母全部给转换成n
四、管道:只能接收标准输出,而不能接收错误输出。
管道(使用符号“|”表示)用来连接命令;
命令1 |命令2 |命令3 |…:将命令1的STDOUT发送给命令2的STDIN,命令2的STDOUT发送到命令3的STDIN;
STDERR默认不能通过管道转发,可利用2>&1 | 或|& 实现(无法判断前面的COMMAND是否成功);
最后一个命令会在当前shell进程的子shell进程中执行用来;
1、组合多种工具的功能使用,如下:
eg: ls /etc/ | tr 'a-z' 'A-Z'
2、# who | tee | tr 'a-z' 'A-Z'
3、# ls-l/etc|less一页一页地查看输入:
练习与作业:
1、将/etc/issue文件中的内容转换为大写后保存至/tmp/issue.out文件中
tr [[:lower:]] [[:upper:]] < /etc/issue >//tmp/issue.out
2、将当前系统登录用户的信息转换为大写后保存至/tmp/who.out文件中
# w | tr [[:lower:]] [[:upper:]] > /tmp/who.out
3、一个linux用户给root发邮件,要求邮件标题为”help”,邮件正文如下:Hello,I am 用户名,the system version is here,pleasehelp me to check it ,thanks!
操作系统版本信息
mail help root <
4、将/root/下文件列表,显示成一行,并文件名之间用空格隔开。
# ls/root/ | tr ‘\n’ ‘ ’
作业:
5、file1文件的内容为:”1 2 34 5 6 7 8 9 10” 计算出所有数字的总和
# cat file1 |tr " " "+ " | bc
6、删除Windows文本文件中的'^M'字符
#cat-A f11.ext
#dos2unix f11.txt
7、处理字符串“xt.,l 1jr#!$mn2 c*/fe3 uz4”,只保留其中的数字和空格
# catfiles | tr -d [[:alpha:]][[:punct:]]
8、将PATH变量每个目录显示在独立的一行
#echo $PATH | tr ":" "\n"
9、删除指定文件的空行
# #cat fs | tr -s [[:space:]]
10、将文件中每个单词(字母)显示在独立的一行,并无空行
#cat fs | tr [[:space:]] '\n' | tr -s [[:space:]]
11、软、硬链接区别
软链接:两个文件名拥有两个不同的inode节点号;指向两块不同的数据块;两个文件名是一个“主 从”的关系;其中任何一个删除,对另外的文件名没有任何的影响;每增加一个文件名,inode节点号上的链接数增加一个,反之,删除一个文件名,链接数减一,直至为零,inode节点号和数据块才会被回收;链接的文件名数据块上只是存放源文件名的访问路径;可以对目录进行软链接;可以跨分区创建链接;可以对不存在的文件名创建链接;链接方式上为ln -s 源文件 链接名
硬链接:两个/多个文件名只能拥有同一个inode节点号;指向同一块的数据块;两个或多个文件名是一个“平等”的关系;其中任何的一个删除掉,另外的一个虽然存在,但其指向的链接是一个无效的链接;不能够对目录进行链接;不能跨分区创建链接;不能够对不存在的文件名创建链接;链接方式上为ln 源文件 链接名