一 数据流重定向
概念:将某条命令执行后本应该在屏幕中中显示的数据(信息)传输到其他地方(文件、其它设备--->打印机等)
思考1:默认为什么在屏幕中显示?它的作用机制是什么?
以下仅仅帮助理解:当我们将键盘中的字符或者硬盘中的文件(只是输入源不同)------>内容会进入到内存中------>经过CPU的处理----->得到处理的结果------>被内存中的开启的字符设备(从/dev/pts/n-->数字)引用,展示到屏幕中!
核心点:默认处理的结果到内存中开辟的字符设备文件中/dev/pts/n中
后续:该目录下文件的权限"c"的含义!
重定向目的:改变处理结果的默认保存位置!
图省略:开启两个bash,将内容重定向到其中一个并且观察/dev/pts/目录下的变化!
############################分割线######################################
应用:通常需要将某些重要数据保存下来(日志等--->自动化脚本)
引申:从"找人"(找没找到)引申出"输出"的正确和错误!
后续:找没找到的原因,引申出权限问题!
了解两个概念:标准输出(standard output)和标准错误输出(standard error output)
标准输出:命令执行完所回传的正确信息!
标准错误输出:命令执行失败后所回传的错误信息!
###########################分割线#######################################
测试:
备注:测试必须在普通用户下测试,不然由于权限的问题,没有相应的实验效果!
错误关键字: Permission denied(权限问题,后续探讨)
实验现象:执行一条命令后,不管是正确还是错误的信息,默认都是输出到屏幕中,屏幕中的信息是混乱的!
#############################分割线#################################
本文会以需求为导向进行讲解,在讲解需求之前再来了解一些概念!
(1)标准输入(stdin)--------->0--->传送特殊字符<或者<<---->(方向:键盘【硬盘中的文件】--->屏幕【内存中的字符设备文件中】)
(2)标准输出(stdout)------->1--->传送特殊字符>或者>>------>(方向:屏幕【内存中的字符设备文件中】--->文件【设备中】)
(3)标准错误输出(stderr)->2---->传送特殊字符2>或2>>----->(同上)
说明:默认的文件描述符是标准输入和输出,所以0和1可以默认不写,即【"1>" 和 ">"】【"0<" 和 "<"】 是等价!
##################################分割线#############################################
小知识:">或>>"对应文件的创建方式:
(1)若文件不存在:则创建文件--->注意:用户(指的是除了文件本身所有者和root的其它用户)对当前目录是否有写入的权限!
后续:没有w权限系统是怎么处理的?
(2)文件存在:则清空文件内容,将数据写入,通俗解释-->覆盖了原文件的内容
注意:用户(指的是除了文件本身所有者和root的其它用户)对当前文件是否有写入的权限!
后续:同上!
补充一句:只要涉及读写的都涉及到权限问题!
####################################分割线###########################################
需求1:将数据累加到文件中,而不是将原来的数据删除(覆盖),使用两个大于号(>>),将数据累加到最后面!
find /etc/ -name passwd >> append.txt
说明:累加的方式是将逐行写入!
需求2:将正确和错误的信息分别保存到不同的文件中
find /etc/ -name passwd > right.txt 2> error.txt
现象:数据分门别类的管理,屏幕中没有信息输出!
注意:数字和传送符号是连在一起(表示是一个整体)的且要与文件名有空格!
需求3:将正确和错误的信息都写入同一个文件中(特殊语法)
find /etc/ -name passwd > total 2>&1 #方式1:错误的伪装成正确的(欺骗-->管道符可以用)
##说明:文件描述符的含义,这里&1表示指向了total文件的位置,而不知默认的位置!
find /usr -name passwd &> total1 #方式2:"&"表示And-->所有的
测试说明:如果是root用户操作,可能没有错误的信息!
解释:2>&1 表示 stderr(文件描述为2) 重定向到stdout(文件描述符为1),也就是标准错误信息发送到与标准输出信息的相同位置
方式1缺点:没有按照原样输出(顺序错乱),可能不是想要的!
#########################分割线##################################
说到这差不多了:了解一个比较厉害的东西--->垃圾桶黑洞设备-->/dev/null
需求4:我知道错误信息会发生,要将错误信息忽略掉而不存储!
设备黑洞:/dev/null
特点:可以吃掉任何导向这个设备的信息
需求5:将文件内容清空
[20:31:04][student@foundation10:~]$ echo "Hello Perl" >time.txt
[20:31:46][student@foundation10:~]$ cat time.txt
Hello Perl
[20:31:49][student@foundation10:~]$ >time.txt
[20:31:53][student@foundation10:~]$ cat time.txt
[20:31:56][student@foundation10:~]$ ^C
练习题:
说明:最后一步省略(突然死机了,允悲)!
########################################分割线#########################################
区别:“cat > 文件名"与"cat 文件名"
cat > 文件:没有此文件则会主动创建一个文件,然后可以键入需要输出的内容,如果输入完毕,可以按"ctrl+d"来离开!
理解:由于不是追加,标准输入模式(键盘录入)的数据,会将内容清空!
cat 文件:没有此文件,则报错,系统并不会主动创建!
说明:<ctrl-d>对应作为结束--->
对应的是EOF,即结束输入!
###############################分割线######################################
标准输入(stanard input--->stdin):<与<<
"<"的应用场景:将原本由键盘输入的数据改成由文件内容来代替!
具体:自动化进行建立用户的帐号和密码等-->将帐号和密码写到一个文件中!
需求1:用stdin替代键盘的输入来进行数据的输入
需求2:将文件内容替代键盘的输入
前提:temp.txt文件必须已存在,save.txt不一定要存在!
作用:将temp.txt文件的内容写入到save.txt中,类似于备份文件的内容!
##############################分割线####################################
cat > temp.txt 和cat >temp.txt << EOF区别
区别:效果一样,但自定义的结束标志不同
<< 作用:结束输入
需求2:将cat的信息输出到temp.txt中,且当键盘输入EOF(结束标志位-->可以自定义)时,该次输入就结束!
EOF:“end of file”,表示文本结束符
说明:EOF一般会配合cat能够多行文本输出
需求3:通过脚本自动修改student的密码
修改密码的两种方式
(1) echo "passwd" |passwd --stdin student -->只需要输入一次就OK了
(2) passwd <<EOF 两次密码或者三次(root和普通用户->需要确认) EOF
####################################分割线##########################################
小知识点:"<"和"<<"的区别
理解:<<结束标志是自定义的,但必须进行交互(用户键盘输入),而"<"结束标志是固定的(读取完文件就结束输入)!
#####################################分割线#########################################
管道:管道的作用是将管道前命令的输出变成管道后命令的输入,说白了就是对屏幕本来的输出再进行处理!
狭义上理解:管道过滤错误信息,放行正确的输出信息到相应的设备文件中(屏幕、文件等中)--->后续的伪装!
管道命令:“ | ”的界定符
#####################################分割线##########################################
需求1:以一种便捷的方式(用户体验好---类似于kiddle阅读器)来显示/etc下文件
ls -al /etc | less
执行逻辑:less会去读取ls命令输出后的内容,作为less命令的读取的输入内容
特点:仅能处理由前一个命令传来的正确消息(standard output),对于stardarderror并没有直接的处理能力(错误输出无法通过管道)
思考:默认系统中错误的输出是无法通过管道的,错误的输出也要通过管道?
#####################################分割线##########################################
需求2:统计find /etc/ -name passwd命令输出的行数
find /etc/ -name passwd 2>&1 | wc -l
# 最好在普通用户下测试
说明:错误进行伪装了!
#########################################################################
需求3:需要屏幕中显示信息以及文件中保存相应的信息--->额外复制一份
知识点:双重重定向---> tee
特点:除了屏幕中输出,且指定位置的文件中也有一份!
需求4:复制date命令的输出到file中,并统计输出行数
date | tee file | wc -l
说明:管道符可以有多个,多个命令的组合!
管道命令:可以后跟【|】定界符!
常用的管道命令
cut、grep、sort、uniq、wc、tee、tr、col、join、paste、expand、xargs
xarg场景:许多命令并不支持管道命令,可以通过xargs来提供该命令的使用标准输入!
######################################分割线#########################################
二、 vim 程序编辑器
综述:理解操作符和动作命令、常见的模式、自动补全、插件等!
(1)概念
vim定位:是程序开发的一项很好的工具,是一个"程序开发者工具",而不单是"文字处理软件"
相对文字处理软件增加的功能:颜色或者底线显示一些特殊的信息(用得到),支持正则表达式的查找架构,多文件编辑,块复制等
vim是程序编辑器的理由(举例):vim去编辑一个C程序语言的文件或者 shell script,vim会依据文件的扩展名或者文件内的开头信
息判断该文件的内容而自动调用该程序的语法判断式,再以颜色来显示程序代码与一般信息。
(2)vim的模式
模式分类:一般模式、编辑模式(Insert模式)、命令行模式、可视化模式
逻辑:vim 文件名---->一般模式---->I进入编辑模式---->ESC---->回到一般模式---->输入:---->进入命令行模式--->保存退出:wq
说明:上述流畅的执行是建立在对文件操作有相应权限的前提下
补充:如果文件不存在,则会创建文件(区别 cat)
各模式下可以进行的操作
###1)一般模式(两种条件下进入):vim 文件 或者 编辑后 esc
操作:左右移动光标、复制文件数据、粘贴、删除字符或者行
注意:无法编辑文件的内容
(1)vim一般模式下字符的管理
0.光标的移动(常用)
常用(四个方向键),键盘字符排列在一起(h-->左,j-->下,k-->上,l-->右)
需求1:要移动指定的行号,使光标移动到指定的位置(行号--向下)
测试:向下移动指定的行数------>30j或者30(朝下的箭头)
需求2:移动到光标的所在行的最前面的字符和最后面的字符
参考系:光标
最前面:0或者home键
最后面:$或者end键
需求3:移动到文件的第一行/最后一行、移动到文件的第n行(配合 ":set使用")
参考系:文件
文件第一行(首字符前面):gg
文件的最后一行(首字符前面):G
移动到文件的第n行:n(数字)G
----------------------------
1.字符的复制和粘贴(从当前光标阴影开始)
相关说明:y:copy---->l:letter---->w:word
y1l ##复制一个字母(默认1不写)
y3l ##复制3个字母
y1w ##复制一个单词
y3w ##复制3个单词
y1y ##复制一行(默认1不写)--->常用
y3y ##复制3行
p ##复制完成后按“P”粘贴(注意:粘贴是在当前光标前(P)后(p)面粘贴的!!!)
执行逻辑(细节):复制---->从当前光标处(阴影)开始复制n个字母(字符)---->粘贴:在当前光标之后粘贴
单词的标示:空格
试出来的:p6p------>操作(光标选中的粘贴,然后又粘贴了6个)
--------------------------
2.字符的删除
坐标:以光标为单位
d:delete
dl ##删除一个字母d3l
d3l ##删除3个字母
dw ##删除一个单词
d3w ##删除3个单词
d3d ##删除3行
dd ##删除光标所在的一整行
ndd ##删除光标所在的向下n行(从当前光标所在行开始)
3.字符的剪切
c:cut
cl ##剪切一个字母
c3l ##剪切3个字母
cw ##剪切一个单词
c3w ##剪切3个单词
cc ##剪切一行
c3c ##剪切3行
注意:剪切过后会进入到插入模式(左下角的标示),在执行粘贴动作时一定要Esc退出插入模式,再p粘贴!
通俗的理解:剪切过后会由一般模式进入插入模式,必须退出插入模式
小知识点:如果上一条命令执行错了,需要回退怎么办?键入"u"即可,注意不是ctrl+z
-------------------------------
###2)编辑(插入--替换)模式(一种情况进入):输入{I、i、等}
标示:左下方出现INSERT或者REPLACE的标示
1.其它进入插入模式的情况
i ##光标所在位置插入
I ##光标所在行行首(常用)
a ##光标所在字符的下一个位置
A ##光标所在行行尾
o ##光标所在行下一行(相当于换行)
O ##光标所在行上一行
s ##删除光标所在字符插入(了解)
S ##删除光标所在行插入(了解)
补充:剪切后也会进入插入模式
此模式特点:可以在文件中输入字符
2.进入替换模式
r:只会替换光标所在的那一个字符一次;R:会一直替换光标所在的文字,直到Esc为止!
------------------
###3)命令行模式
进入:输入"{:,/,?}"三种任何一个按钮,可以将光标移动到最下面一行(命令执行行)
功能:查找数据、读取、保存、大量替换、离开vim、显示行号、设置一些信息等
(1)在vim的命令模式下配置vim的工作方式
:set nu ##行号添加
:set nonu ##取消行号(临时,一般不需要)
:set mouse=a ##添加鼠标选择
:set cursorline ##行线显示
说明:以上设定都是临时的
需求1:永久设定方式(修改vim配置文件)
vim /etc/vimrc
具体操作:进入文件后转化到编辑模式,在此文件最后加入以上参数(行号的添加、鼠标的添加、行线的显示)
注意:默认是不是即时生效,必须让其把配置文件重新加载到内存中才会生效
再执行:source /etc/vimrc
思考:如何设置制表符呢?
(2)vim命令模式下关键字搜索(查找)
一般模式下键如:/关键字
(3)在linux下的vim中替换
搜索方向:n--->向下匹配;N--->向上匹配
(4)批量替换字符
替换命令的格式是:[range]s(search)/pattern/string/[c(confirm),e(不显示error),g(globe:将做整行替换),i(ignore:忽略大小写)]
:%s/原有字符/替换后字符 ##只替换每一行中出现的第一个原有字符 等价的方式---->:[1,$]s/原有字符/替换后字符
:%s/原有字符/替换后字符/gc ##替换所有,并且用用户交互(替换前需要用户确认--confirm)
:1,5s/原有字符/替换后字符/g ##替换1-5行(区间替换)--->与替换命令模式最匹配。
(5)移动光标
:数字(移动到指定的行------>常与":set nu结合使用")
###4)vim异常退出
特点:在vim异常退出时,系统中会在所编辑的文件目录中生成.file.swp并且vim再次编辑此文件时会出现相应提示
此模式下的相关命令:
按 "o" open(只读---多人编辑的时候,只是查看内容而不编辑内容)
按 "e" edit(正常打开文件,不载入暂存文件)
按 "r" recover(加载暂存文件,用来救回之前未保存的工作,注意:救回来之后保存文件后还得自行手动删除暂存文件,否则一直提示警告信息)
按 "d" delete .swap file(确定暂存文件无用,那么打开文件之前会先将暂存文件删除)--->常用(可能不知道暂存文件是怎么来的!)
按 "q" quit(离开vim)
思考:何为异常退出?
###5)vim的可视化模式(VISUAL BLOCK)
进入:在命令模式下按“ctrl+v”---->进入到可视模式
功能:在可视模式下可以区域(块)选择字符等操作
说明:主要看光标经过的地方(反白表示选中)
相应的按键:v(字符选择)、V(行选择)、ctrl+v(块选择)、y(复制,粘贴的时候也是以这个模式粘贴,在当前光标之后)、d(直接就删除)
思考:选择了以后,可以做的事情?
(1)可视模式下批量“添加”字符
*>> ctrl+v 选中要加入字符所在列(非字符)--->光标就会反白--->y(复制)--->进入一般模式
*>> 按“I”进入插入模式,写入要加入的字符(粘贴p)
注意:别人讲的步骤(???)!!!
用处:在排列整齐的文本文件中复制/删除块
###6)vim的分屏功能
前提是 vim file1 file2 ------>编辑多个文件(多窗口)
ctrl+w s ###上下分屏
ctrl+w v ###左右分屏
ctrl+w 松手 c(q) ###关闭"光标"所在屏幕(针对分屏)
ctrl+w 上下(kjhl)左右 ###光标移动到指定屏幕(了解)
:sp file2 ##同时编辑当前文件和file2
-------------------------------------------
####7)vim的退出模式(常用)
:q ##当用vim打开文件但没有对字符作任何操作时可直接退出(否则会给与提示)
:q! ##当用vim打开文件并对字符作操作,放弃所有操作退出(用在当前配置文件错误,但是又不知道如何修改,类似于重置)
:wq ##正常保存退出
:wq! ##权限不够的时候,强行保存退出,对超级用户及文件所有人生效!
####8)vim手册
学习vim的命令的文档(自带):vimtutor
:q ##退出vimtutor
知识点:查看文件和文件夹的大小----> db -sh
后续说明:vim编辑器实用技巧的相关概念!