Linux管道、重定向以及文本处理
开源的一个重要理念:不要重复发明轮子。
很多开源软件都是现有软件、代码、功能的重新组合。
《大教堂与集市》
1 Linux多命令协作:管道及重定向
管道和重定向
Linux中,大多数命令都很简单,往往只实现一个或几个简单的功能,我们可以将不同功能的命令组合在一起使用,以达到完成某个复杂功能的目的。
Linux中,几乎所有命令的返回都是纯文本的,而纯文本形式的数据是绝大多数命令的输入格式,这就让协作成为可能。
Linux的命令行为我们提供了管道和重定向机制,多命令协作就是通过管道和重定向完成的。
- 命令行shell数据流有以下定义:
名称 | 说明 | 编号 | 默认 |
---|---|---|---|
STDIN | 标准输入 | 0 | 键盘 |
STDOUT | 标准输出 | 1 | 终端 |
STDERR | 标准错误 | 2 | 终端 |
命令通过STDIN接收参数或数据,通过STDOUT输出结果或通过STDERR输出错误。
- 通过管道和重定向可以控制CLI的数据流
- 管道通常用来组合不同的命令,以实现更复杂的功能
- 重定向通常用来保存命令的输出或错误信息
分类 | 关键字 | 定义 | 例子 |
---|---|---|---|
重定向 | > |
将STDOUT重定向到文件(覆盖) | echo "linuxcast.net" > outfile |
重定向 | >> |
将STDOUT重定向到文件(追加) | echo "linuxcast.net" >> outfile |
重定向 | 2> |
将STDERR重定向到文件(覆盖) | echo "linuxcast.net" 2> outfile |
重定向 | 2>&1 |
将STDERR与STDOUT结合 | echo "linuxcast.net" 2>&1 outfile |
重定向 | < |
STDIN | grep linuxcast < /etc/passwd |
管道 | | |
将一个命令的STDOUT作为另一个命令的STDIN | ls -l | grep linuxcast |
一个更复杂的例子:查找用户linuxcast的Video文件,将查找错误重定向到null(丢弃)
find / -user linuxcast 2> /dev/null | grep Video
2 Linux命令行文本处理工具
文件浏览
cat/more/less/head/tail
基于关键字搜索-grep
该命令使用正则表达式搜索指定的纯文本文件或纯文本(管道)
-i
忽略大小写-n
现实结果所在行数(文件)-v
输出不带关键字的行(反选)-Ax
输出的时候包含结果所在行之后的指定行数-Bx
输出的时候包含结果所在行之前的指定行数
基于列处理文本-cut
-d
指定分割字符,默认为TAB-f
指定输出的列号-c
基于字符进行切割,固定长度
例:
cut -d: -f1 /etc/passwd
以:
为分割符,显示第一列
grep linuxcast /etc/passwd | cut -d: -f3
输出用户linuxcast的uid(第三列)
cut -c2-6 /etc/passwd
第2-6个字符
文本统计-wc
-l
只统计行数line-w
只统计单词word-c
只统计字节数-m
只统计字符数
文本排序-sort
-r
进行倒叙排序-n
基于数字进行排序-f
忽略大小写-u
删除重复行-tc
使用c作为分隔符分割为列进行排序-kx
当进行基于指定字符分割为列的排序时,指定基于哪个列排序
删除重复行
sort -u
排序时删除重复行uniq
删除重复的相邻行
文本比较-diff
-i
忽略大小写-b
忽略空格数量的改变-u
统一显示比较信息(一般用以生成patch文件)
diff -u linuxcast linuxcast-new > final.patch
检查拼写-aspell
aspell check linuxcast
aspell list < linuxcast
处理文本内容-tr
translate
tr -d ‘TMD‘ < linuxcast
删除关键字tr ‘a-z‘ ‘A-Z‘ < linuxcast
转换大小写
搜索替换-sed
使用正则表达式处理文本文件
sed ‘s/linux/unix/g‘ linuxcast
替换linux为unix,/g
全部替换sed ‘1,50s/linux/unix/g‘ linuxcast
替换1-50行sed -e ‘s/linux/unix/g‘ -e ‘s/nash/nash_su/g‘ linuxcast
多个正则表达式sed -f sededit linuxcast
将匹配表达式保存在sededit文件中