Linux基础命令-文本处理工具与标准I/O和管道
文本处理工具与标准I/O和管道
一、抽取文本的工具
1. 文件内容
文件查看命令:cat,nl,tac,rev
1. cat [ OPTION ] ... [ FILE ] ...
- E :显示行结束符$ - n:对显示出的每一行进行编号
- A :显示所有控制符
- b:非空行编号
- s:压缩连续的空行成一行
2. nl [ OPTION ] ... [ FILE ] ...
(nl 命令在 Linux 系统中用来计算文件中行号。nl 可以将输出的文件内容自动的加上行
号,其默认的结果和与 cat - n 有点不太一样,nl 可以将行号做比较多的显示设计,
包括位数是否自动补齐 0 等等的功能)
- b : 指定行号指定的方式,主要有两种
- b a :表示无论是否为空行,也同样列出行号 ( 类似 cat - n)
- b t:表示有空行,空的那一行不要列出行号 ( 默认值)
- n:列出行号表示的方法,主要有三种
- n ln :行号在萤幕的最左方显示;
- n rn :行号在自己栏位的最右方显示,且不加 0 ;
- n rz :行号在自己栏位的最右方显示,且加 0 ;
- w :行号栏位的占用的位数;
- p :在逻辑定界符处不重新开始计算。
3. tac [ OPTION ] ... [ FILE ] ...
(将指定文件中的行,按照反序方式显示)
-- version 显示命令版本信息
-- help 显示帮助文档
- b | -- before 将分隔符放到文件记录前
- r | -- regex 将分隔符当做一般字符处理
- s | -- separator= STRING 使用指定的间隔字符取代新建的控制字符
4. rev [ OPTION ] ... [ FILE ] ...
(The rev utility copies the specified files to standard output,
reversing the order of characters in every line.
If no files are specified, standard input is read. )
(rev命令将文件中的每行内容以字符为单位反序输出,即第一个字符最后输出,
最后一个字符最先输出,依次类推)
[ root@centos7 data] # rev 0. txt
321321
123123
[ root@centos7 data] # cat 0. txt
123123
321321
5. more:分页查看文件
more [ OPTIONS ... ] FILE ...
- d: 显示翻页及退出提示
6. less:一页一页地查看文件或STDIN 输出
查看时有用的命令包括:
/ 文本 搜索 文本
n/ N 跳到下一个 或 上一个匹配
less 命令是man命令使用的分页器
2. 文件截取
1. head [ OPTION ] ... [ FILE ] ...
- c # 指定获取前#字节
- n # 指定获取前#行
- # 指定行数
2. tail [ OPTION ] ... [ FILE ] ...
- c # 指定获取后#字节
- n # 指定获取后#行
- # 同上
- f 跟踪显示文件fd新追加的内容, 常用日志监控
相当于 -- follow= descriptor
- F 跟踪文件名,相当于-- follow= name -- retry
3. tailf 类似tail –f,当文件不增长时并不访问文件
3. 按列抽取和合并文件
cut [ OPTION ] ... [ FILE ] ...
- d DELIMITER : 指明分隔符,默认tab
- f FILEDS :
#: 第#个字段
#, #[ , #] :离散的多个字段,例如1 , 3 , 6
#- #:连续的多个字段, 例如1 - 6
混合使用:1 - 3 , 7
- c 按字符切割
-- output- delimiter= STRING 指定输出分隔符
显示文件或STDIN 数据的指定列
cut - d: - f1 / etc/ passwd
cat / etc/ passwd | cut - d: - f7
cut - c2- 5 / usr/ share/ dict/ words
2. paste 合并两个文件同行号的列到一行
paste [ OPTION ] ... [ FILE ] ...
- d 分隔符:指定分隔符,默认用TAB
- s : 所有行合成一行显示
示例:
paste f1 f2
paste - s f1 f2
4. 排序和统计
1. wc [ OPTION ] ... [ FILE ] ...
计数单词总数、行总数、字节总数和字符总数
可以对文件或STDIN 中的数据运行
wc story. txt
39 237 1901 story. txt
行数 字数 字节数
常用选项
- l 只计数行数
- w 只计数单词总数
- c 只计数字节总数
- m只计数字符总数
- L 显示文件中最长行的长度
2. sort [ OPTION ] ... [ FILE ] ...
把整理过的文本显示在STDOUT ,不改变原始文件
常用选项
- r 执行反方向(由上至下)整理
- R 随机排序
- n 执行按数字大小整理
- f 选项忽略(fold)字符串中的字符大小写
- u 选项(独特,unique)删除输出中的重复行
- t c 选项使用c做为字段界定符
- k X 选项按照使用c字符分隔的X 列来整理能够使用多次
3. uniq [ OPTION ] ... [ FILE ] ...
从输入中删除前后相接的重复的行
- c: 显示每行重复出现的次数
- d: 仅显示重复过的行
- u: 仅显示不曾重复的行
注:连续且完全相同方为重复
常和sort 命令一起配合使用:
sort userlist. txt | uniq - c
5. 打补丁
在Linux应用中,作为DBA ,我们知道MySQL跑在Linux系统之上,数据库最重要的追求
就是性能,“稳”是重中之重,所以不能动不动就是换系统或是换这换那的,这个时候
除非是万不得已,要不然都是在原有基础上改改就行了,也就是给内核及下载的一些
源码打补丁或者说是升级,那么在Linux下使用diff制作补丁以及如何使用patch打
补丁显得尤为重要。
一、找不同:diff命令(differences)
-- compare files line by line
一行一行的比较文本文件
作用:
比较两个文件之间的差异,输出结果为两个文件的不同之处。
使用diff命令制作补丁。
格式:
diff [ OPTION ] ... FILES
选项:
- u:会将不同的地方放在一起,紧凑易读
diff - u linuxidc. com1 test2 > test. patch (利用diff命令生成补丁patch)
- r:递归比较目录下的所有文件(比较文件夹时候一定要接- r)
1 、diff命令:找不同
shell> cp fruit. txt shuiguo. txt
shell> diff fruit. txt shuiguo. txt
shell> echo "banana" >> fruit. txt
shell> diff fruit. txt shuiguo. txt
9 d8
< banana
shell> echo "cherry" >> shuiguo. txt
shell> diff fruit. txt shuiguo. txt
9 c9
< banana
-- -
> cherry
2 、diff命令:制作补丁文件
shell> cat ni. txt
jinan
changqing
linux
chinaitsoft
shell> cp ni. txt wo. txt
shell> diff ni. txt wo. txt
shell> diff - u ni. txt wo. txt
shell> echo "zhangjiacai" >> wo. txt
shell> diff - u ni. txt wo. txt
-- - ni. txt 2016 - 11 - 02 16 : 11 : 35.253976996 + 0800
++ + wo. txt 2016 - 11 - 02 16 : 13 : 50.037971397 + 0800
@@ - 2 , 3 + 2 , 4 @@
changqing
linux
chinaitsoft
+ zhangjiacai
shell> vim ni. txt
shell> cat ni. txt
jinan
linux
chinaitsoft
shell> diff - u ni. txt wo. txt
-- - ni. txt 2016 - 11 - 02 16 : 16 : 32.930978061 + 0800
++ + wo. txt 2016 - 11 - 02 16 : 13 : 50.037971397 + 0800
@@ - 1 , 3 + 1 , 5 @@
jinan
+ changqing
linux
chinaitsoft
+ zhangjiacai
解析:
@@ 代表一段范围
- 代表ni. txt
+ 代表wo. txt
使用 > 输出重定向生成补丁文件ni- to- wo. patch
shell> diff - u ni. txt wo. txt > ni- to- wo. patch
shell> cat ni- to- wo. patch
-- - ni. txt 2016 - 11 - 02 16 : 16 : 32.930978061 + 0800
++ + wo. txt 2016 - 11 - 02 16 : 13 : 50.037971397 + 0800
@@ - 1 , 3 + 1 , 5 @@
jinan
+ changqing
linux
chinaitsoft
+ zhangjiacai
如此,我们就做好了一个补丁文件。
二、打补丁:patch命令
-- - apply a diff file to an original.
用途:
用来打补丁-- - 修补文件
格式:
patch [ 选项] 原始文件 < 补丁文件
- pN:N 表示忽略N 层路径
- R : 还原到老版本
注意事项:
①如果打多个补丁,注意先后顺序;
②打补丁前不要修改源文件;
1 、文件和文件的比较
shell> diff ni. txt wo. txt
1 a2
> changqing
3 a5
> zhangjiacai
shell> diff ni. txt wo. txt > ni- to- wo. patch
shell> patch ni. txt < ni- to- wo. patch
patching file ni. txt
shell> diff ni. txt wo. txt
shell> patch - R ni. txt < ni- to- wo. patch
patching file ni. txt
shell> diff ni. txt wo. txt
1 a2
> changqing
3 a5
> zhangjiacai
2 、目录和目录的比较
[ root@localhost linuxidc. com] # tree qq- v1
qq- v1
├── hosts
└── image
└── 1. txt
[ root@localhost linuxidc. com] # tree qq- v2
qq- v2
├── hosts
├── image
│ └── 1. txt
├── passwd
└── sound
└── 3. txt
[ root@localhost linuxidc. com] # diff - ur qq- v1 qq- v2
Only in qq- v2: passwd
Only in qq- v2/ sound: 3. txt
[ root@localhost linuxidc. com] # diff - Nur qq- v1 qq- v2
diff - Nru qq- v1/ passwd qq- v2/ passwd
-- - qq- v1/ passwd 1970 - 01 - 01 08 : 00 : 00.000000000 + 0800
++ + qq- v2/ passwd 2016 - 11 - 02 17 : 07 : 47.664980339 + 0800
@@ - 0 , 0 + 1 , 31 @@
+ root: x: 0 : 0 : root: / root: / bin/ bash
+ bin: x: 1 : 1 : bin: / bin: / sbin/ nologin
解析:
- N -- new - file(Treat absent files as empty)如果没有文件,就拿一个空文件和别的目录里的文件比较
制作补丁文件进行对目录的打补丁
[ root@localhost linuxidc. com] # diff - Nur qq- v1 qq- v2 > patch- v2. txt #比较文件夹生成补丁文件-- 备用:补丁文件patch- v2. txt在linuxidc. com目录下
- pnum or -- strip= num
Strip the smallest prefix containing num leading slashes from each file name
found in the patch file.
例如:/ a/ b/ c/ d/ e/ f/ g
- p3 的效果就是去掉第3 个/ 前面的内容,效果:c/ d/ e/ f/ g
- p4 的效果就是去掉第4 个/ 前面的内容,效果:d/ e/ f/ g
1 > 内层打补丁
[ root@localhost linuxidc. com] # cd qq- v1 #进入qq目录,进去里面进行打补丁
[ root@localhost qq- v1] # patch - p1 < . . / patch- v2. txt
patching file passwd
patching file sound/ 3. txt
[ root@localhost qq- v1] # cd . .
[ root@localhost linuxidc. com] # diff - Nru qq- v1 qq- v2
[ root@localhost linuxidc. com] # cd qq- v1
[ root@localhost qq- v1] # patch - R - p1 < . . / patch- v2. txt
patching file passwd
patching file sound/ 3. txt
[ root@localhost qq- v1] # cd . .
[ root@localhost linuxidc. com] # diff - Nru qq- v1 qq- v2
diff - Nru qq- v1/ passwd qq- v2/ passwd
-- - qq- v1/ passwd 1970 - 01 - 01 08 : 00 : 00.000000000 + 0800
++ + qq- v2/ passwd 2016 - 11 - 02 17 : 07 : 47.664980339 + 0800
@@ - 0 , 0 + 1 , 31 @@
+ root: x: 0 : 0 : root: / root: / bin/ bash
+ bin: x: 1 : 1 : bin: / bin: / sbin/ nologin
2 > 外层打补丁
[ root@localhost linuxidc. com] # patch - p0 < patch- v2. txt
patching file qq- v1/ passwd
patching file qq- v1/ sound/ 3. txt
墙裂建议:
任何操作前,记得对文件、目录做好备份,防止操作失败导致数据丢失。
原文链接
二、标准I/O和管道
1. 三种I/O设备
1. 程序:指令+ 数据
读入数据:Input
输出数据:Output
2. 打开的文件都有一个fd: file descriptor ( 文件描述符)
3. Linux给程序提供三种 I / O 设备
标准输入(STDIN )-0 默认接受来自键盘的输入
标准输出(STDOUT )-1 默认输出到终端窗口
标准错误(STDERR )-2 默认输出到终端窗口
4. I / O 重定向:改变默认位置
2. 把I/O重定向至文件
a. 把输出和错误重新定向到文件
1. STDOUT 和STDERR 可以被重定向到文件
命令 操作符号 文件名
支持的操作符号包括:
> 把STDOUT 重定向到文件
2 > 把STDERR 重定向到文件
& > 把所有输出重定向到文件
2. > 文件内容会被覆盖
set - C 禁止将内容覆盖已有文件, 但可追加
> | file 强制覆盖
set + C 允许覆盖
3. >> 原有内容基础上,追加内容
4.2 > 覆盖重定向错误输出数据流
5.2 >> 追加重定向错误输出数据流
6. 标准输出和错误输出各自定向至不同位置
COMMAND > / path/ to/ file. out 2 > / path/ to/ error. out
7. 合并标准输出和错误输出为同一个数据流进行重定向
& > 覆盖重定向
& >> 追加重定向
COMMAND > / path/ to/ file. out 2 > & 1 (顺序很重要)
COMMAND >> / path/ to/ file. out 2 > & 1
8. ( ) :合并多个程序的STDOUT
( cal 2007 ; cal 2008 ) > all. txt
b. tr命令
tr 转换和删除字符
tr [ OPTION ] ... SET1 [ SET2 ]
选项:
- c –C -- complement:取字符集的补集
- d -- delete :删除所有属于第一字符集的字符
- s -- squeeze- repeats:把连续重复的字符以单独一个字符表示
- t -- truncate- set1:将第一个字符集对应字符转化为第二字符集对应的字符
[ : alnum: ] :字母和数字
[ : alpha: ] :字母
[ : cntrl: ] :控制(非打印)字符
[ : digit: ] :数字
[ : graph: ] :图形字符
[ : lower: ] :小写字母
[ : print: ] :可打印字符
[ : punct: ] :标点符号
[ : space: ] :空白字符
[ : upper: ] :大写字母
[ : xdigit: ] :十六进制字符
c. 从文件中导入STDIN
1. 使用 < 来重定向标准输入
2. 某些命令能够接受从文件中导入的STDIN
tr ‘a- z’ ‘A - Z ’< / etc/ issue
该命令会把/ etc/ issue中的小写字符都转换成大写字符
3. tr –d abc < / etc/ fstab
删除fstab文件中的所有abc中任意字符
4. cat > file
zjl
wangxiaochun
按ctrl+ d离开,可以使用文件来代替键盘的输入
5. cat < file1 > file2
6. cat < file1 >> file1
d. 把多行发送给STDIN
使用“<< 终止词”命令从键盘把多行重导向给STDIN
直到 终止词 位置的所有文本都发送给STDIN
有时被称为就地文本(here documents)
mail - s "Please Call" admin@magedu. com << END
> Hi Wang
>
> Please give me a call when you get in . We may need
> to do some maintenance on server1.
>
> Details when you're on- site
> Zhang
> END
3. 使用管道
1. 管道(使用符号“| ”表示)用来连接命令
命令1 | 命令2 | 命令3 | …
a. 将命令1 的STDOUT 发送给命令2 的STDIN ,命令2 的STDOUT 发送到命令3 的STDIN
b. STDERR 默认不能通过管道转发,可利用2 > & 1 或 | & 实现
c. 最后一个命令会在当前shell进程的子shell进程中执行
d. 组合多种工具的功能
ls | tr ‘a- z’ ‘A - Z ’
2. less :一页一页地查看输入
ls - l / etc | less
3. mail: 通过电子邮件发送输入
echo "test email" | mail - s "test" wang@example. com
4. bc:算术运算
echo "2^3" | bc
5. 示例:
将 / home 里面的文件打包,但打包的数据不是记录到文件,而是传送到 stdout,
经过管道后,将 tar - cvf - / home 传送给后面的 tar - xvf - , 后面的这个 - 则是取
前一个命令的 stdout, 因此,就不需要使用临时file了
tar - cvf - / home | tar - xvf -
6. 命令1 | tee [ - a ] 文件名 | 命令2
把命令1 的STDOUT 保存在文件中,做为命令2 的输入
- a 追加
7. 使用:
保存不同阶段的输出
复杂管道的故障排除
同时查看和记录输出