标准I/O和管道

  • 三种I/O设备
  • 把I/O重定向至文件
  • 使用管道

重定向 redirect

标准输入和输出
程序:指令+数据
		读入数据:Input
		输出数据:Output
打开的文件都有一个fd:file descriptor(文件描述符)
	/dev/std*
	/proc/self/fd 终端 
linux给程序提供三种I/O管道
标准输入(STDIN) -0 默认接受来自键盘的输入
		例如:bc(计算器)
	标准输出(STDOUT) -1 默认输出到终端窗口
	标准错误(STDERR) -2 默认输出到终端窗口
I/O重定向:改变默认位置
STDOUT和STDERR可以被重定向到文件
  命令    操作符号    文件名
  
>       把STDOUT重定向到文件  
2>      把STDERR重定向到文件
&> = > file 2&>1  把所有输出重定向到文件
<       输入重定向
清空大文件:> /boot/bigfile 立即释放空间
>> 追加  >> /data/ls.log 更加安全的创建文件
依赖于当前shell ,更换其他shell将无法创建
(command;command)>file 
set -C 禁止重定向覆盖
set +C 允许重定向覆盖
>| file 强制覆盖
tr命令(外部命令)
tr 转换和删除字符
 选项 : 
       -c -C --complement:取代所有不属于第一字符集的字符
	   -d --delete:删除所有属于第一字符集的字符
	   -s --squeeze-repeats:把连续重复的字符以单独一个字符表示
	   -t --truncate-set1:将第一字符集对应字符转化第二字符对应的字符
[:alnum:]: 字母和数字 
[:alpha:]: 字母 
[:cntrl:]: 控制(非打印)字符
[:digit:]: 数字 
[:graph:]: 图形字符  
[:lower:]: 小写字母  
[:print:]: 可打印字符
[:punct:]: 标点符号  
[:space:]: 空白字符  
[:upper:]: 大写字母
[:xdigit:]:十六进制字符   
Windows和linux的文本格式不同(不可见字符)
man ascii  查看ascii   
在linux ascii中 '\n'表示回车  '\r'表示换行 
在Windows中 回车和换行意思基本相同
hexdump -C  命令    可以查看文件16进制
tr -d '\r' < win.txt 
tr -d '\r' < win.txt > win2.txt  (生成新文件)

用这样的方式将Windows格式转化为linux格式

或者  可以使用 dos2unix 命令 将Windows格式转化为unix格式
               unix2dos 命令 可以将unix格式 转化为Windows格式
  • mail -s 标题 hi wang
    • 正文
    • .
多行重定向
cat > f1.log <<EOF(终止词)
> 123
>fff
>dsf
>EOF (结束)
  • 慎用
cat <f1.txt > f1.txt  
cat <f2.txt >>f2.txt  
passwd root &> /dev/null 隐藏信息
管道 ( | )
  • 将命令1的标准输出作为命令2的标准输入

将标准错误输出

 ls /data  /err  2<&1 | tr '[:lower:]' '[upper]'
  或  ls /data /err |& tr '[:lower:]' '[upper]'

重定向到多个目标

tee 
	-a 追加 (append)
command 1 | tee [-a] file | command 2
   把命令1的STDOUT保存在文件中,作为命令2的输入

使用: 
   保存不同阶段的输出
   复杂管道的故障排除
   同时查看和记录输出

seq 生成序列
面试题:
计算1+2+...+100的总和

seq -s + 1 2 100 | bc
  • /dev/urandom 这个设备专门用来生成随机数
  • cat /dev/urandom | tr -dc '[0-9a-zA-Z]'|head -c12 生成随机安全码
  • openssl rand-base64 9 生成9位随机数

管道中 - 符号

示例:
将/home里面的文件打包,但打包的数据不是记录到文件呢,而是传送到stdout,
经过管道后,将tar -cvf - /home 传送给后面的tar -xvf -,后面的这个 - 则是取前一个命令的stdout,因此,就不需要使用临时file了

tar -cvf - /home | tar -xvf