重定向和管道

本文详细讲解了Linux中的标准输入输出、I/O重定向技巧,如输出重定向到终端或文件、错误处理、多行重定向及tr命令的应用。此外,还介绍了邮件查看、管道符在命令流中的作用和less、lpr工具的使用,以及tee命令的灵活运用。

标准输入和输出

程序:指令+数据
读入数据: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有标准输出,所以后面还可以跟管道。
### Linux 重定向管道命令使用教程 #### 一、基本概念 Linux 中的 **重定向** **管道** 是强大的工具,用于控制数据流并增强命令行的功能。通过这些功能,用户可以将标准输入(stdin)、标准输出(stdout)以及错误输出(stderr)重新指向其他位置。 - **重定向** 可以将命令的结果保存到文件中或将文件作为命令的输入。 - **管道** 则允许将一个命令的标准输出连接到另一个命令的标准输入上[^1]。 --- #### 二、重定向符号及其用途 以下是常见的重定向符号及其含义: | 符号 | 描述 | |------------|----------------------------------------------------------------------| | `>` | 将输出覆盖写入指定文件。如果目标文件不存在,则会创建新文件[^1]。 | | `>>` | 将输出追加到指定文件末尾而不删除原有内容[^1]。 | | `<` | 将文件内容作为命令的输入。 | | `2>` | 将错误消息(stderr)写入指定文件[^1]。 | ##### 示例代码: ```bash # 覆盖方式将 ls 命令的输出写入 file.txt ls > file.txt # 追加方式将 echo 的输出添加到 file.txt echo "附加内容" >> file.txt # 使用文件 content.txt 作为 sort 命令的输入 sort < content.txt # 将错误信息写入 error.log grep "pattern" non_existent_file 2> error.log ``` --- #### 三、管道命令的基础用法 **管道符 (`|`)** 用于将前一个命令的输出作为下一个命令的输入。这使得多个命令能够串联起来完成复杂的任务。 ##### 经典案例: ```bash cat /etc/passwd | grep "root" ``` 上述命令先读取 `/etc/passwd` 文件的内容并通过 `grep` 查找包含字符串 `"root"` 的行[^3]。 --- #### 四、高级应用——Tee 命令 当需要同时查看命令输出并将该输出保存到文件时,可使用 `tee` 命令。它不仅转发数据至下一流程,还会将其复制到指定文件中[^2]。 ##### 实例演示: ```bash # 显示 passwd 文件的最后一行,并将整个内容存档于 backup.txt cat /etc/passwd | tee backup.txt | tail -n 1 ``` 此脚本实现了两个目的:一是保留原始数据;二是提取特定部分供后续分析或展示之需。 --- #### 五、结合 Xargs 提升效率 有时单靠管道无法满足需求,这时引入 `xargs` 工具便显得尤为重要。它可以接收来自上游的数据片段,并据此构建新的子进程调用来执行更精细的操作[^3]。 ##### 应用场景举例: 假设要查找当前目录下的所有 `.txt` 文件并对它们逐一计算字数统计: ```bash find . -name "*.txt" | xargs wc -l ``` 这里利用了 find 定位符合条件的目标集合后交由 xargs 来逐项处理每份文档长度测量工作流程。 --- ### 总结 掌握好 Linux 下的重定向管道机制对于提升日常运维效率至关重要。无论是简单的日志记录还是复杂的数据解析链路搭建都离不开这两者的灵活运用^。 问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值