第一部分 重定向
第二部分 tr
第三部分 管道
第四部分 tee
一 重定向
1.1说明
Linux系统中一切皆文件,打开一文件,Linux会自动分配一个称为文件描述符的软连接,指向正在打开的文件。
文件描述符是一个非负整数(通常是小整数),是内核为了高效管理已被打开的文件所创建的索引。
所有执行I/O操作的系统调用都需要文件描述符
数据流向有
输入流:通常键盘输入
1.2 输出流:
标准输出流:正确的输出到当前的终端屏幕
错误输出流:标准错误输出到显示
当一个程序启动,会自动打开三个I/O设备文件:
STDIN:标准输入文件,得到文件描述符为 0
STDOUT:标准输出文件,得到文件描述符为 1
STDERR:标准错误输出文件,得到文件描述符为 2
此时, 再次打开一个新的文件,那么它的文件描述符为3.
文件描述符是由 linux内核的默认值觉得的。
I/O重定向是: 把数据流流传到非默认设备的其他地方。
输入输出重定向
1.3语法:
Command >file 输出重定向到文件
Command <file 输入重定向到file
Command >>file 输出追加的方式重定向到file
n>file 将文件描述符为n的文件重定向file
n>>file将文件描述符为n的文件以追加的方式重定向到file
n>&m 将输出文件m和n合并
n<&m 将输入文件m和n合并
2>&1 的意思就是将标准错误重定向到标准输出。这里标准输出已经重定向到了 /dev/null。那么标准错误也会输出到/dev/null2>>&1
1.4多行标准重定向
Command >>EOF
Line1
Line2
EOF
一般在脚本中使用。
1.5备注:
Bash中可以设置禁用覆盖重定向
set -C 禁止将内容覆盖已有文件,但可以追加。这个设置也可以使用强制覆盖的表达方式执行覆盖: >|file
set +C 表示允许覆盖
二 利用tr命令实现字符转换
2.1 tr命令可以对来自标准输入的字符进行替换、压缩和删除。它可以将一组字符变成另一组字符
2.2语法
tr(选项)(参数)
2.3选项
-c或——complerment:取代所有不属于第一字符集的字符;
-d或——delete:删除所有属于第一字符集的字符;
-s或--squeeze-repeats:把连续重复的字符以单独一个字符表示;
-t或--truncate-set1:先删除第一字符集较第二字符集多出的字符。
参数
- 字符集1:指定要转换或删除的原字符集。当执行转换操作时,必须使用参数“字符集2”指定转换的目标字符集。但执行删除操作时,不需要参数“字符集2”;
- 字符集2:指定要转换成的目标字符集。
2.4实例
1 将输入字符由大写转换为小写:
echo "hello world" | tr 'a-z' 'A-Z'
2 使用tr删除字符:
#echo "hello world 456" | tr -d '0-9'
hello world
3 将制表符转换为空格:
#cat text | tr '\t' ' '
4 字符集补集,从输入文本中将不在补集中的所有字符删除:
#echo aa.,;s 1 b#^bb 2 c*/cc 3 ddd 4 | tr -d -c '0-9 \n'
1 2 3 4
此例中,补集中包含了数字0~9、空格和换行符\n,所以没有被删除,其他字符全部被删除了。
5. 用tr压缩字符,可以压缩输入中重复的字符:
#echo "thissss is a text linnnnnnne." | tr -s ' sn'
this is a text line.
6. 巧妙使用tr做数字相加操作:
#echo 1 2 3 4 5 6 7 8 9 | xargs -n1 | echo $[ $(tr '\n' '+') 0 ]
7. 删除Windows文件“造成”的'^M'字符:
#cat file | tr -s "\r" "\n" > new_file
或
#cat file | tr -d "\r" > new_file
8. 将/etc/passwd文件的前6行的信息转换为大写字符到输出
#head -n 6 /etc/passwd |tr ‘a-z’’a-Z’
9使用glob:
tr '[:lower:]' '[:upper:]'
10 生成固定长度的随机密码
head /dev/urandom | tr -dc A-Za-z0-9 | head -c 20
三 管道 “|”
一个连接程序,实现将前一个命令的输出直接定向后一个程序当作输入的数据流
管道使用格式:
Command1|Command2|Command3…
使用管道操作符“|”可以把一个命令的标准输出传送到另一个命令的标准输入中,连续的|意味着命令的输出为下一个命令的输入
例子:
获取/etc/passwd的第一行数据
# cat /etc/passwd|cut -d: -f1
四 tee命令
可以接收标准输入并重定向多个目标,进行管道处理。
格式:tee [option] [file]
option:
-a: 数据添加到文件中,不覆盖原文件。
例子:
输出test到(以添加不覆盖的方式)文件test1.txt和test2.txt,同时输出到标准输出中
#echo 'test' | tee -a test1.txt test2.txt