重定向和管道

标准输入和输出

程序:指令+数据
读入数据:input
输出数据:output

打开的文件都有一个fd:file descriptor(文件描述符)

Linux给程序提供三种I/O设备

标准输入(STDIN) -0 默认接受来自键盘的输入
标准输出(STDOUT) -1 默认输出到终端窗口
标准错误(STDERR) -2 默认输出到终端窗口

I/O重定向(redirect):改变默认位置

1.输出结果重定向到其他的终端窗口。
	ls > /dev/pts/1  将当前的返回结果,重定向到/dev/pts/1中去。
	whoami > /dev/pts/2  将whoami的返回结果,重定向到/dev/pts/2中去。
	> f1 创建f1的空文件,便是重定向做的f1空文件,因为前面什么命令都没有,相当于没有输出于是就创建一个空文件。


2.输出结果重定向到某个文件中去。
	who > who.log who的结果集,重定向放在who.log文件中。
	如果换一换,
	whereis > who.log 因为上面已经有who.log的文件,并且已经有内容了。那么这里会直接覆盖文件内容。
	如果想文件不变,内容不丢,则
	whereis >> who.log 原内容则不丢,把whereis的返回集内容追加在原内容下。
	
如果不想系统可以覆盖文件或者文件内容:
	set -C:可以禁止系统中进行覆盖文件或者文件内容的操作,可以追加。
	set +C:取消禁止系统中进行覆盖文件或者文件内容的操作。
	
	如果已经set -C禁止覆盖了,也可以用>|强行覆盖。例:ip a >| who.log
	
三种I/O设备的STDIN -0、STDOUT -1、STDERR -2编号的用法:
	ls /etc/ -R > /data/etclist.txt:将ls的目录递归显示出所有etc下的目录文件信息的返回集,
		重定向放到/data/etclist.txt文件中。这是>,是没有编号的,不过默认为1,也就是ls /etc -R 1> /data/etclist.txt
	
	cmd > /data/errlist.txt:cmd命令在Linux中是不存在的,所以会报错,但是报错信息不会存入errlist.txt中,
		但是也会创建errlist.txt这个文件,只是没内容,空文件。
		如果需要把报错信息也重定向存入文件中,则:
		cmd 2> /data/errlist.txt即可。2表示STDERR,错误标准信息。
		也可以cmd 2>> /data/errlist.txt。把错误信息重定向追加到原本的errlist.txt内容下。
		
注意:/dev/null是个垃圾桶文件,不要的信息可以往里丢,比如不想别人看到某个命令的输出结果,例:
	rm -rf /data/ 2> /dev/null
	
	命令不全都是对或者错,也有命令是有对有错的。则:
	ls /etc /error:则是半对半错。这时,可以这么重定向:
	ls /etc /error > /data/etclist 2> /dev/null
	
	同样,可以把对的和错的都重定向到一个文件中:
	ls /boot /error &> /data/all.txt
	or
	ls /boot /error > /data/all2.txt 2>&1   把ls /boot /error中对的结果放在all2.txt中,2>&1表示把2错的变成1对的。2>&1顺序不能乱。必须在后面。
	
	把两条命令都重定向到某个文件中:
	(cal 08 2020;cal 10 2020) >> /data/all.txt
	
标准输入:用文件内容代替键盘,输入到终端窗口。例:
	nano f1.txt,f1.txt中2*3   2^8两个内容。
	bc就是一个输入命令。那么:
	bc < f1.txt
	将bc的结果重定向到bclist.txt中。
	bc < f1.txt > bclist.txt
	
多行重定向(就地文本heretxt):
	cat > f1 <<EOF:cat后面不跟路径文件就是一个输入输出的命令。cat > f1就是将输入的内容重新输出后重定向给f1文件,
		cat > f1 <<EOF,表示多行重定向,可以多行输入,以EOF字符结尾之前的输入内容重新输出后重定向给f1文件。EOF结束。
		注意:EOF不是绝对的,只是EOF比较常用,用A、B、E、F都行。
			  EOF或其他结尾的字符必须单独一行,任何字符符号都不能有,否则就不认为是结束。
	
	例:多行重定向,并且将命令格式写入进去,语句中调用其他命令用``符号,调用变量直接$变量即可:
		cat > f1 <<EOF
		> My hostname is `hostname`
		> My username is $USER
		> EOF

tr命令:

	tr [option] set1 [set2]:转换或者删除字符。例:
		tr 'a-z' 'A-Z':将输入的小写字符转换成大写字符。
		
	那么,可以将文件内容输入到tr命令中。例:
	tr 'a-z' 'A-Z' < /etc/issue > /data/etclist.txt:将/etc/issue文件中的小写字母转换成大写字母,并重定向到/data/etclist.txt文件中。
	
	tr的set1和set2选项是一一对应的,例如,tr 'a-c' '1-3':将a转换成1,b转换成2,c转换成3。其他的不转换。set2选项有对应的set1转换,没对应转换的不转换,例:
		tr 'a-c' '1-4' 4是多出来的,没有对应,只转换abc三个。
		
		set1选项多出来,和set2选项不对应,例:
		tr 'a-d' '1-3' 则d转换成3,set1选项多出来的,和set2选项不对应的值,则转换成set2选项的最后一个值。当然这个规则是可以修改的:
			-t的参数,set1选项多出来的值,和set2没有对应的,则不做转换。例:tr 'a-d' '1-3',则d不做转换。
			
			-d的参数,有-d参数时,只有set1选项,没有set2选项,例:tr -d 'abc',输入的所有字符去掉abc,输入:abcdf,输出:df。
			
			-c和-C的参数,去字符集的补集。例:tr -dc '0-9',去掉出去0-9之外的所有字符。注意:这时需要用ctrl+d作为提交,而不是回车,这时Linux识别不了回车。
				例:1 xt.,2 j3 r#!$4 mb,只保留数字、b字母和空格:echo '1 xt.,2 j3 r#!$ 4 mb' | tr -dc '[0-9][b][ ]'
				用[]可以选择去掉多个,如果字符串中有特殊含义,又不需要它表示出特殊含义,则用单引号括起来。
			
			
			-s的参数,压缩连体重复的字符。例:tr -s 'abc',压缩连续重复的a和b和c。输入aaaeokcpaobbdsacccccsaqaaa,返回:aeokcpaobdsacsaqa
				将who的返回值重定向到wholist.txt中,压缩连续的重复成一个空格并把这个空格转换成+号:tr -s ' ' '~' < wholist.txt
				注意:tr输入的某个文件,再次重定向输出给某个文件不能是原文件,例:tr -s ' ' '+' <1+2+3+..100.txt >bc.txt,重定向给bc.txt,不能再次重定向给1+2+3+...+100.txt这个文件。
				
			1+2+3+..+100的题:
				echo {1..100} > echolist.txt,将{1..100}的值,重定向给echolist.txt文件。
				tr -s ' ' '+' < echolist.txt > bc.txt,将echolist.txt文件中的空格替换成+号后输出结果重定向给bc.txt。
				bc < bc.txt
				
			tr -d '\n' :删除回车。win中的文本换行是回车加换行。这时需要把win中的文本换行转换成Linux的换行就得删除win中的回车。
				需要删除某文件的回车,直接tr -d '\r' < 某文件即可。(\n是换行)
				

mail:查看账号邮件。如果有邮件,输入邮件编号即可直接查看邮件内容。退出是quit。
mail -s "邮件名" 接收人$USER:发邮件,下方会让用户输邮件具体内容,以.结束。

管道

	命令1 | 命令2,也就是把命令1的输出传给命令2作为输入,最后输出。当然,也可以一直命令3|命令4|命令5。结论一样。
	
	例如:whoami | tr 'a-z' 'A-Z':就是将whoami的输出结果,作为tr的输出,最后输出ROOT。
	
	例如:1+2+3+..100:echo {1..100} | tr ' ' '+' | bc 。输出5050.
	
	| 这个竖线就是管道符。

	注意:管道符左边的命令必须是标准输出。不是标准错误,不是标准输入。管道符右边需要标准输入

	注意:如果不确定管道符左边的命令是否是标准输出,可能导致标准错误,那么可以转换成标准输出,把错误信息也可以作为标准输入给管道符右边的命令。
	
	例:errorcmd 2>&1 | tr 'a-z' 'A-Z'   or    errorcmd |& tr 'a-z' 'A-Z'  两种方法,都行,都可以把错误转换成输出。


	less:把文件内容作分页显示,例如:cat /porc/meminfo  | less,空格往下翻页,q退出,方向上下键可以一行一行操作,PgUp、PgDn上下翻页。
	
	lpr:把内容发送给打印机。例:echo "test print" lpr -P print_name

	- 符号:例:tar -cvf - /home | tar -xvf -   tar -cvf - /home,将/home打包,打包的文件名叫- ,tar -xvf - ,解包,将前面的-文件名解包。
	- 作为临时文件。这样就不需要专门创建一个临时file了。

tee:

命令1 | tee [-a] 文件1 | 命令2。
	把命令1的标准输出保存到文件1中,并且作为命令2的输入使用。-a表示是否追加,没有-a就会将文件1的内容全部覆盖。
	
	类似重定向到文件1中,不过依然在终端窗口输出命令1的结果。后方的命令2可加可不加,只是tee有标准输出,所以后面还可以跟管道。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值