[RH124] 5-重定向、管道、编辑器
1.默认输入输出
默认输入---键盘: stdin
默认输出---屏幕: stdout
2.输出重定向
重定向:改变数据流输出的位置、方向,例如输出到文件。使用 ">" 表示。
1)普通重定向
命令 > 文件名
例如 ifconfig > ~/leo/log.txt ,将ifconfig的输出重定向到~/leo/log.txt文件中。
如果多个命令使用">"重定向到同一个文件,那么该文件的内容会被覆盖。
/def/null文件(黑洞):
ls > /dev/null # /dev/null是一个黑洞。扔进去的内容都会消失。
2)追加重定向
命令 >> 文件名
例如 ifconfig > ~/leo/log.txt,ls >> ~/leo/log.txt 。这样ls的输出就会被追加到~/leo/log.txt的最后。
3)错误重定向
当我们输入一个错误的命令,系统会提示命令不存在。此时我们想重定向该错误信息到文件中,重定向不生效。
这是因为:
">"、">>"只能重定向正确的结果。">"相当于是"1>",">>"相当于是"1>>"。
"2>"就是重定向错误信息,"2>>"是追加错误信息。
例如 ifconfig 2> err.txt ,err.txt中的内容就是ifconfig命令不存在。
4)使用重定向需要注意的点
(如果我们使用xxx > aa.txt来重定向结果。那么会出现什么情况? 首先我们使用的是">",那么系统首先会清空aa.txt的内容,然后执行xxx发现命令不存在,所以最终的结果就是aa.txt被清空,但是内容未写入。)
如果我们想把正确的和错误的都重定向到文件中,怎么办:
xxxxxx > aa.txt 2>&1 ,相当于把错误的当成正确的(放水)。
ifconfig 2> aa.txt 1>&2 ,相当于把正确的当成错误的(穿小鞋)。
以上内容比较绕,那我们使用一个统一的标识:
&> 和 &>> ,分别表示覆盖和追加,前面的&表示不管是正确还是错误。
例如: ifconfig &>> aa.txt,xxxx &>> aa.txt 。这样ifconfig正确结果和xxxx的错误结果都保存到了aa.txt中。
3.输入重定向
tr "a-z" "A-Z" >> hello.txt < /etc/hosts :将/etc/hosts的内容重定向到tr命令,经过小写到大写的转换后,再重定向到hello.txt中。也可以写作: tr "a-z" "A-Z" < /etc/hosts >> hello.txt 。
4.grep
grep root passwd :把/etc/passwd里含root的所有行过滤出来。
grep -n root passwd :过滤内容,并显示行号。
grep -i root passwd :忽略大小写进行过滤。匹配含有root、ROOT、ROot等内容的行。
grep -v root passwd :反向过滤,匹配不含root的行。
grep -n -A3 root passwd :过滤含root的行,并且显示后面的3行。
grep -n -B3 root passwd :过滤含root的行,并且显示前面的3行。
grep -n -C3 root passwd :过滤含root的行,并且显示前后的3行。
grep ^root passwd :过滤以root开头的行。
grep root$ passwd :过滤以root结尾的行。
5.管道"|"
ifconfig | grep inet :将ifconfig命令的输出作为grep的参数,在其中查找包含inet的行。
cat -n passwd | head -15 | tail -5 : 获取passwd中11行-15行的内容。
6.编辑器
gedit:类似于Windows下的记事本。
vim:vi的增强版。最小化安装系统,默认没有安装vim。
命令格式: vim file 。打开file,开始编辑。
学习文档:vimtutor。
vim有三种模式:
1)命令模式:进入vim时默认就是命令模式。
命令模式下的操作:
u:撤销。
ctrl+r:前进,与u撤销相反。
yy:复制行。按完yy后,光标移动要粘贴的位置按p粘贴。
p:粘贴。
nyy:n为数字键,在命令模式下先按数字,表示要复制几行(包含光标所在行),然后按yy。
dd:剪切行,如果剪切后不粘贴,就相当于删除该行。
ndd:类似nyy,即剪切n行。如果文件大,想删除后面所有行,那就使用10000dd,多使用几次就删除了。
x:删除光标当前所在位置的字符。
nx:类似nyy和ndd,不过功能是删除当前光标所在位置后n个字符,如果想删除到末尾,就先输入一个比较大的值就可以了。例如1000x。
r:替换光标所在位置的字符。
R:按完R后,可以连续替换多个字符,完成后按ESC取消R。
ZZ:快捷保存退出,相当于":wq"。
gg:切换到首行。或者1G。
G:切换到最后一行。
nG:切换到第n行,例如1000G,切换到第1000行。如果想切换到尾行,直接输入G。
dG:从光标所在行删除到末尾。如果要删除全部,先按gg,再按dG。
Ctrl+v:进入视图模式,然后按方向键可以选择一批字符,然后做其他操作,例如替换(r),删除(x),复制(y,不是yy)。
如何使用#号注释多行:Ctrl+v,然后按下选择多个字符,按大写的I,然后输入#,再按ESC。
2)插入模式:在命令模式按"i,a,o,I,A,O"可以进入插入模式。
i:从当前光标处插入。
u:在命令模式下按u,类似于windows的ctrl+z,撤销。
o:光标所在行的下一行产生一个空白行,并进去插入模式。
I:大写的i。光标移到当前行的最前面,并进入插入模式。
A:大写的a。光标移到当前行的最后面,并进入插入模式。
O:大写的o。在光标所在行的上一行产生一个空白行,并进入插入模式。
3)末行模式:只能从命令模式来进入,所以在插入模式的时候需要先按ESC进入命令模式。再从命令模式进入末行模式。
使用"/"进入:在命令模式按"/",然后 /关键字 ,按n向后查询,按N向前查询。 /关键字\c 忽略大小写查询。
使用":"进入:可以用于保存退出、不保存退出、打开某文件、另存为、执行命令、修改属性、替换。
保存:":w"。
保存并退出:":wq",也可以用":x",不能是"qw"。
不保存并退出:":q!"。
打开某文件:":r file",打开file,并且把内容插入到光标位置的下一行。
另存为:":w filename",将内容另存到指定的file中。
执行命令:将命令执行结果插入到当前光标位置,例如":.!ls /boot",":.!ifconfig"。在命令模式按两下"!",可以自动跳到":.!"。
显示行号:":set number",但显示的行号不是文档的内容,只是编辑器提供的行号。这种操作显示的行号都是临时的。
如果要让vim打开默认显示行号,就在用户的家目录下创建一个文件叫".vimrc"。里面写上set number。只对当前用户有效,对其他用户无效。
如果想让所有用户都默认显示行号,那就编辑/etc/vimrc,在空白行添加set number。
替换:
:s/old/new/ ,将光标所在行的第一个old替换为new。
:s/old/new/g ,将光标所在行所有old替换为new。
:m,ns/old/new/g ,从m行到n行替换所有的old为new。
:m,ns/old/new/g ,中的m和n可以使用几个变量,"."表示光标当前行,"$"表示最后一行,"$-1"表示倒数第二行,以此类推。
全文替换:
:1,$s/old/new/g" ,"1,$"可以使用"%"代替, :%s/old/new/g 。
:%s/^old/new/g :替换处于开头的old。
当替换的关键字包含特殊字符,例如"/",那么可以使用转义字符。
:%s/\/old\//new/g :使用转义字符"\"来对"/"进行转移。但是这样显得很复杂。
实际上 :s/old/new/g 中间的分隔符不一定要用"/"。可以使用其他符号代替,例如 :s#old#new#g , :s#/old/#new#g 。
:s/old//g :new的位置什么都不写,就相当于删除old。
分屏:
:sp 。按两次Ctrl+w可以上下切换。
7.VIM的模板
我们在写shell脚本、Python脚本、Perl脚本等时,我们都要在文档的开头协商 #!/bin/bash 、 #!/usr/bin/python 等。那么我们可以定义一个vim模板,当我们打开一个脚本文件时,自动生成。
1.打开 /etc/vimrc 文件。
2.找到这行:
3.复制一行,修改为: autocmd BufNewFile *.sh 0r /usr/share/vim/vimfiles/template.sh 。
4.创建一个文件 /usr/share/vim/vimfiles/template.sh 。在第一行写上 #!/bin/bash 。