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 
	9d8
	< banana
	  //diff命令后面,第一个文件有9行,第二个文件有8行,<表示右边文件内容缺失
	
	shell> echo "cherry" >>shuiguo.txt 
	shell> diff fruit.txt shuiguo.txt 
	9c9
	< banana
	---
	> cherry
	  //diff命令后面,两个文件都是9行,<右边文件缺失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 
  //copy文件没有内容差异
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 
1a2
> changqing
3a5
> 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 
1a2
> changqing
3a5
> 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> 外层打补丁
//如果qq-v1和qq-v2在相同目录下,就不需要去掉一层路径
[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.STDOUTSTDERR可以被重定向到文件

	命令 操作符号 文件名
	 支持的操作符号包括:
	>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.将命令1STDOUT发送给命令2STDIN,命令2STDOUT发送到命令3STDIN
	b.STDERR默认不能通过管道转发,可利用2>&1|& 实现
	c.最后一个命令会在当前shell进程的子shell进程中执行
	d.组合多种工具的功能
		ls | tr ‘a-z’ ‘A-Z2.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
	把命令1STDOUT保存在文件中,做为命令2的输入
	-a 追加
7.使用:
	保存不同阶段的输出
	复杂管道的故障排除
	同时查看和记录输出

发布了12 篇原创文章 · 获赞 4 · 访问量 937

猜你喜欢

转载自blog.csdn.net/qq_41596208/article/details/103981367