开发者学堂课程【Linux文件管理命令:重定向和管道】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/591/detail/8347
重定向和管道
内容介绍
一、课前回顾
二、重定向
三、管道
四、课后练习
一、课前回顾
掌握文件的结构,节点编号,节点表等概念
1.文件的各种操作命令
创建的文件管理工具,创建文件,创建空文件 touch
其他常见工具 cp mv rm
2.软连接,硬链接
链接文件的创建,有软链接和硬链接之分,链接与软链接的根本区别在于,硬链接本身是一个文件,因为它的节点标号是相同的,软链接与原始文件不是一个文件,因为它的节点编号不一样,软链接不会增加链接数,软连接支持目录硬链接不支持目录,软链接支持文件夹,硬链接不支持文件夹。
把一个文件从一个目录移动到另一个目录mv/root/f1/data/f2
如果创建硬链接底层 In/root/f1/root/f2, 在不同的分区中,将一个数据迁移到新的分区中,在迁移时,把数据复制过去的前提要在新的分区中分配一个空闲的节点编号,同时,在节点表里增加一条新的记录,这个新的文件属性是什么,例如他的权限,所有者时间等等,称为文件的源数据,节点表增加完之后,给数据找一个空闲的空间块,将数据填入进去。
创建硬链接是在节点表里不会增加新的记录,节点编号是 10000,后面跟文静的其他属性,权限 root,时间 time 等等,指针指向存放路径,除此之外,文件名不放在此处,文件名放在 root 对应的节点表目录中。
二、重定向
1.文件的重定向
包括标准输入重定向,标准输出重定向,以及错误的重定向。
用数字0表示输入,1表示输出,2表示错误
一个命令,如果有标准输出,想要标准重定向在一个别的文件中
cmd >file
错误信息想要重定向 cmd 2>file,
输入的重定向 cmd<file,
如果想保留原来的旧内容 cmd >>file,cmd 2>>file, 此外,还可以把标准输出和错误统一定向到一个文件中 cmd &>file 或者 cmd >file 2>&1
2. tr 命令
tr 转换和删除字符
tr [OPTION] . . . SET1 [SET2]选项:
-c-C--complement: 取字符集的补集
-d--delete: 删除所有属于第一字符集的字符
-s--squeeze-repeats: 把连续重复的字符以单独一个字符表示
-t--truncate-set1:将 第一个字符集对应字符转化为第二字符集对应的字符[:alnum:]:字母和数字[:alpha:]:字母[:cntrl:]:控制(非打印)字符[:digit:]: 数字 [:graph:]:图形字符 [:lower:]:小写字母 [:print:]:可打印字符[:punct:]:标点符号 [:space:]:空白字符 [:upper:]:大写字母[:xdigit:]:十六进制字符
3.从文件中导入 STDIN
使用<来重定向标准输入
某些命令能够接受从文件中导入的 STDIN
tr 'a-z' I 'A-Z' </etc/issue
该命令会把 /etc/issue 中的小写字符都转换成写写字符
tr-d abc</etc/fstab 删除fstab文件中的所有 abc 中任意字符
cat> file
mage
wangxiaochun
按 ctrl+d离开,可以使用文件来代替键盘的输入
Cat> filea <fileb
cat 命令是读取键盘输入的内容,同时并在屏幕上输出出来,既有标准输入,拥有标准输出的命令
[root@centos7 data] #cat
aabcef
aabcef
^C
4.单行重定向和多行重定向
输入 [root@centos7 data] #cat> f1 回车后键盘输入内容 aa ,正常要标准输出结果,因为大于号,重定向到 f1 ,回车输入 bb ,f1 中有内容:
[
单行重定向一会车就重定向,
一下子写很多行统一重定向多行重定向
[root@centos7 data] #cat > f1 <<b
>123
>abc
>xyz
>b
> b
>aaa
>b
[root@centos7 data] #cat f1
123
abc
xyz
b
b
aaa
多行重定向比单行重定向效率高,这种写法经常用于创造一些文件用,编写程序,编写脚本,通过程序自动生成一些文件。
用多行重定向通常用约定俗成的符号,EOF 是文件结束的意思
[root@centos7 data] #cat> f1 <<EOF
>AAA
>BBB
>f1
>
>XXX
>EOF
[root@centos7 data] #cat f1
AAA
BBB
f1
XXX
多行重定向还有一个好处,还可以,把以前学的变量放入里面,我的主机名是,主机名可以用一个命令来生成,用户信息用一个变量 user 来实现
[root@centos7 data] #cat <f1 <<EOF
>My hostname is ‘hostname‘
My username is $USER
>EOF
My hostname is centos7.localdomain
My username is root
[root@centos7 data] #cat> f1 <<EOF
My hostname is hostname
My username is $USER
EOF
[root@centos7 data] #cat f1
My hostname is centos7.localdomain
My username is root
5.把多行发送给 STDIN
使用“<<终止词”命令从键盘把多行重导向给STDIN
直到 终止词 位置的所有文本都发送给STDIN有时被称为就地文本(heretext)
mail -s "Please Call" admin@magedu.com < <END
>Hi Wang,
>
>Please give me a call when you get in. We may need
>to do some maintenance on server1.
>
>Details when you're on-site>Zhang
>END
三、管道
1.管道
管道(使用符号“I”表示)用来连接命令
命令1|命令2|命令3|...
将命令1的 STDOUT 发送给命令2的 STDIN ,命令2的 STDOUT 发送到命令3的STDIN
STDERR 默认不能通过管道转发,可利用2>&1或|&实现
最后一个命令会在当前 shell 进程的子 shell 进程中执行用来
组合多种工具的功能 Is|tr 'a-z''A-Z'
2.管道中-符号
less:一页一页地查看输入 Is-1/etc|less
mail: 通过电子邮件发送输入
echo "test email"|mail -s "test" user@example.com
lpr: 把输入发送给打印机
echo "test print"|lpr|-Pprinter_name
示例:将/home 里面的文件打包,但打包的数据不是记录到文件,而是传送到stdout,经过管道后,将 tar-cvf-/home 传送给后面的 tar-xvf-, 后面的这个-则是取前一个命令的 stdout, 因此,就不需要使用临时 file 了
tar-cvfF/home|tar-xvf -
3.重定向到多个目标(tee)
命令 1|tee[-a] 文件名|命令2 把命令1的 STDOUT 保存在文件中,做为命令2的输入-a 追加
使用:
保存不同阶段的输出
复杂管道的故障排除
同时查看和记录输出
四、练习
1、将/etc/issue 文件中的内容转换为大写后保存至/tmp/issue.out 文件中
2、将当前系统登录用户的信息转换为大写后保存至/tmp/who.out 文件中
3、一个linux用户给 root 发邮件,要求邮件标题为“help”,邮件正文如下:Hello,I am 用户名,The system version is here,please help me to check it,thanks! 操作系统版本信息
4、将/root/下文件列表,显示成一行,并文件名之间用空格隔开
5、计算1+2+3+..+99+100的总和
6、删除Windows文本文件中的'^M' 字符
7、处理字符串“xt.,l1jr#!$mn 2 c*/fe 3 uz 4”,只保留其中的数字和空格
8、将 PATH 变量每个目录显示在独立的一行
9、将指定文件中0-9分别替代成 a-j
10、将文件/etc/centos-release 中每个单词(由字母组成)显示在独立一行,并无空行