Linux | 文件比较 / vi编辑与使用 / 文件通配符

1 文件比较

1.1 基本功能

1.2 cmp 两文件逐字节比较

cmp文件比较

md5sum / sha1sum / sha512sum 文件内容比较

1.3 diff 求出两文件的差别

  1.4 版本管理系统

2 vi 编辑器及乱码问题

2.1 vi命令 文本文件的编辑

 (1)正文插入

(2)光标单字符移动(现在可用方向键操作)

(3)翻页 行尾行首

(4)行尾行首

(5)移动一个单词

(6)移到指定的行

(7)括号配对%

(8)删除命令

(9)字符替换

(10)取消 上一次编辑操作

(11)重复上一次编辑操作

(12)文件存盘以及退出

(13)文件读入和写操作

(14)剪贴板

(15)快操作:复制与删除

(16)行合并,刷屏和状态显示

(16)模式查找

(17)模式替换

2.2 Linux使用过程中遇到的几个问题

(1)所谓的终端 “死机”问题

(2)意外中止问题

(3)退格键(Backspace)问题

(4) 显示乱码问题

(5)文本文件格式问题

(6)中文编码问题

(7) 命令iconv

3 文件名和文件目录信息

3.1 文件和目录的命名规则

3.2 系统配置信息

3.3 可运行程序和设备文件

3.4 头文件和库文件

4 文件通配符规则

4.1 文件通配符

4.2 文件通配符处理过程

(1)通配符处理流程

(2)程序获取命令行参数的方式

(3)shell 文件名通配符处理

(4)验证文件通配符处理方式


1 文件比较

1.1 基本功能

  • cmp和散列算法:判断两个文件内容是否相同
  • 文件数据完整性验证
  • diff:列出两个文本文件之间的区别
  • 版本管理

1.2 cmp 两文件逐字节比较

cmp文件比较

用法

  • cmp file1 file2

功能

  • 逐字节比较两个文件是否完全相同
  • 两个文件完全相同时,不给出任何提示
  • 两个文件不同时,打印出第一个不同之处

md5sum / sha1sum / sha512sum 文件内容比较

  • md5sum:使用MD5算法(散列函数)根据文件内容生成16字节hash值,比较hash值是否相同,就可以判断两文件内容是否完全相同。
  • sha1sum:使用SHA-1算法的命令名为sha1sum(20字节hash值)。
  • 常用于数据完整性(data integrity)验证和判断位于网络不同机器上的两个文件内容是否相同。(例如校验下载的软件是否别修改)

1.3 diff 求出两文件的差别

用法

  • diff file1 file2
  • diff -u file1 file2     # diff -u2 file1 file2  在u后面可以增加数字,会显示相同的行,当数字足够大时几乎会显示文件。

功能

  • 比价两个版本的文本文件,以寻找两者间差别
  • 输出格式 normal, unified (-u)
  • normal 格式:列出一个如果将file1转化为file2的指令。
  • 这些指令有 a (Add), c (Change) 和 d (Delete);
  • 指令字母左边的行号是file1的行号,右边是file2的行号;
  • 列出内容时,大于后后边的内容时需要在file1文件中增加的内容; 
  • 小于号后边的内容是需要从file1中删除的内容。(移除屏幕)

  1.4 版本管理系统

集中版本管理系统:

  • 1975年 SCCS
  • 1986年 CVS
  • 2001年 SVN
  • 2005年 GIT (目前使用最多的版本管理系统)

基本功能

  • 对一个目录树(项目)下的文本文件(源程序,脚本及文档)进行版本管理
  • 便于多人合作开发的项目(一个代码库,多个现场)
  • 可以通过网络访问代码库

2 vi 编辑器及乱码问题

2.1 vi命令 文本文件的编辑

 (1)正文插入

  • i   在当前字符前插入正文段,直至按ESC键(insert)
  • a  在当前字符后插入正文段,直至按ESC键(append)

(2)光标单字符移动(现在可用方向键操作)

  • h  光标左移一列,5h 光标左移5列
  • j   光标下移一行
  • k  光标上移一行
  • l   光标右移一列

(3)翻页 行尾行首

  • Ctrl-b  向后翻页(backward)
  • Ctrl-f   想前翻页(forward)
  • 现在可以用 PgDn 和 PgUp 键代替

(4)行尾行首

  • ^   将光标移至当前行首
  • $   将光标移至当前行尾

(5)移动一个单词

  • w   移到右一个单词
  • b    移到左一个单词
  • 也可以使用 6w 和 5b 命令

(6)移到指定的行

  • :23‘回车’   光标定位于23行
  • :1‘回车’     光标定位于行首
  • :$‘回车’     光标定位于文件尾

(7)括号配对%

  • 把光标移到一个花括号(或圆括号,或方括号)上,按%,则光标自动定位到与它配对的哪一个括号。

(8)删除命令

  • x    删除当前字符
  • dd  删除当前行的命令,4dd 从当前行开始连续删除3行

(9)字符替换

  • r   替换光标出字符
  • ra 将当前光标处字符替换为a
  • 将当前光标处开始的三个字符一次替换为abc,则需要按命令rarbrc

(10)取消 上一次编辑操作

  • u   取消上一次的编辑操作

(11)重复上一次编辑操作

  • .   按圆点可以重复上一次的编辑操作
  • 例如按 3dd命令删除了三行,然后按 . 就会再次删除三行,即每按一次就会删除三行

(12)文件存盘以及退出

  • ZZ   存盘退出
  • :wq<ent>   存盘退出
  • :w<ent>     存盘不退出
  • :q!<ent>    不存盘退出

(13)文件读入和写操作

  • :r  xy.c<ent>   读入文件xy.c插入到当前行之下
  • :50,$w  file1<ent>    写文件,把第50行至文件尾的内容写到文件file1中,不进行覆盖
  • :50,$w!  file1<ent>   写文件,但是会进行强制覆盖。(常用在编辑文件中存盘时发现没有权限时可以通过该命名将文件存在有权限的地方保存,以至于编辑的文件不会丢失)

(14)剪贴板

删除,并拷贝到剪贴板

  • :10,50d<ent>  删除第10~50行
  • :1,.d<ent>       删除文件首至当前行的部分
  • :.,$d<ent>       删除当前行到文件尾

不删除,拷贝到剪贴板(yank)

  • :10,50y<ent>   烤贝到剪贴板

粘贴剪贴板信息(paste)

  • p

(15)快操作:复制与删除

复制

  • :5,10co56<ent>   复制第5~10行到第56行之下

移动

  • :5,10m34<ent>    移动第5~10行到第34行之下

(16)行合并,刷屏和状态显示

两行合并(Jion)

  • J   当前行下面的行合并到当前行

刷新屏幕显示(load)

  • Ctrl-l 

状态显示(Ctrl-g)

  • Ctrl-g  在屏幕最下面一行列出正在编辑的文件的名字,总行数,当前行数,文件是否被修改过等信息。

(16)模式查找

查找命令

  • 格式   /pattern
  • 例:   /[0-9][0-9]*

继续查找命令

  • n   向下查找下一个next
  • N   向上查找下一个
  • 循环式搜索(向下搜索时遇到文件尾则回头到文件头继续搜索)

(17)模式替换

替换命令(substitution)

  • 格式   :n1,n2s/pattern/string/g
  • :1,50s/adc/xyz      替换1~50行的abc为xyz,一行有多个abc时只替换一次
  • :1,50s/adc/xyz/g   替换1~50行的abc为xyz,一行有多个abc时全部进行替换
  • :50,80s/^/    /         第50~80行右移4列
  • :50,80s/^    //         第50~80行左移4列
  • :1,$s/ *//                消除尾部多余的空格

2.2 Linux使用过程中遇到的几个问题

(1)所谓的终端 “死机”问题

现象:vi编辑结束后执行存盘操作,结果导致屏幕卡死,输入任何信息都不再有显示(死机,终端卡死)。

原因:vi编辑结束后按下<Ctrl-S>,因为Windows编辑器一般设置<Ctrl-S>热键的动作为Save,但是Linux却进入流量控制状态。

解决方法:按下<Ctrl-Q>键后流量控制解除。

现象说明与解释:这是Linux系统早期的流量控制机制

  • 终端的显示速度跟不上主机的发送速度
  • 主机送来的数据在终端需要打印出来,但打印速度慢
  • 主机送来的显示内容,需暂停显示,仔细分析。需要流控

基于上述原因,需要一种机制,终端可以控制主机方向来的数据流量。

<1> RS232接口链接主机和终端的流控

硬件方式:增加一条通信线进行流量控制,现在几乎不用。

软件方式:利用流控字符 Xon 和 Xoff,ASCII码表中的控制字符,码值分别是17和19。

  • 终端希望主机暂停发送数据时,发送Xon字符;终端希望主机继续发送数据时,发送Xoff字符。
  • 手动控制:Xon/Xoff控制字符分别被定义为ASCII码的17和19,对应按键的<Ctrl-S>和<Ctrl-Q>,当按下停止显示按钮时,其他按键都无法使得终端恢复显示,因为此刻主机无法将数据送来。

<2> 网络虚拟终端的流控

  • 网路虚拟终端在主机和终端之间用TCP协议。
  • TCP有流量控制功能,终端显示速度落后于数据生成速度,由于TCP自己有解决机制,所以无需Xon/Xoff。
  • 该方法下手动控制流控几乎不会起作用了,因为网速太快和缓冲的原因,很难将显示暂停到自己感兴趣的位置。
  • 为了与历史机制的兼容仍旧保留手动的<Ctrl-S>和<Ctrl-Q>机制。

(2)意外中止问题

现象:vi编辑结束后存盘,程序意外中止,编辑成果丢失,文件内容未发生变化。

原因:vi存盘命令<Shift-ZZ>,误操作为<Ctrl-ZZ>,然而<Ctrl-Z>按键将导致当前运行的进程被挂起(suspend),暂停运行(但进程尚在,处于Stopped状态)。

解决方法:调用bash的作业管理机制,恢复运行被Stopped的进程

  • jobs     列出当前被Stopped的进程有哪些
  • %1      将1号作业恢复到前台运行
  • fg %1  同上述命令,也是将1好作业恢复到前台运行

(3)退格键(Backspace)问题

现象:bash命令输入时,Backspace键可以用,但是,运行自己写的程序时Backspace键无法正常使用。

原因:当前终端的“行律”设置不正确。

解决方法:Backspace按键对应的ASCII吗是控制字符<Ctrl-H>

  • 执行 stty erase ^H 设定行律模块把 <Ctrl-H> 设为删除符,以后 <Ctrl-H> 和Backspace都可以做删除。如果需要,可以把命令放到 $HOME/.bash_profile(自启动文件,放到这里后终端重启后不会丢失设置信息) 中。(类似的,stty erase ^A可以设置用<Ctrl-A>做删除操作)

(4) 显示乱码问题

显示乱码问题

现象:cat /bin/bash或head -n 1 /bin/bash  导致屏幕乱码,键盘输入也只能看到画表用的框框符。

原因:/bin/bash 文件不是文本文件,这些二进制内容逐字节送到终端,凑巧一个序列被终端理解为一个转义序列,执行动作:修改了终端字符集。

解决方法:断开连接,重新登录;注意不要把非文本信息在终端输出。

(5)文本文件格式问题

现象:Linux下的文本文件在windows用notepad打开,所有内容粘在一行内。

原因:Linux和windows在文本文件的存储格式不同。(两者在存储文件时文件行的行尾不同,windows在行尾存回车和换行两个字符)

解决方法

  • 在Linux完成格式转换后再用windows处理(首选此方案)。
  • 用windows中可容忍Linux文本文件格式的其他编辑打开。

文本文件格式

  • dos2unix/uinx2dos,todos/frodos(两种格式之间转换)
  • file   查看文件的数据类型,供参考

(6)中文编码问题

问题:从windows迁来的文件,只有在显示中文字符时是乱码。Linux本生的中文信息正常显示。

原因:中文GBK与UTF8不兼容。

英文字符集:7比特ASCII吗,字节高位为0的,后面7位是英文ASCII码。

中文字符编码

  • GBK    windows默认中文编码方案,两个字节表示一个汉字,字节的高位为1,以区别与ASCII码。
  • UTF8   许多Linux默认中文编码方案,三个字节表示一个汉字,字节的高位为1,以区别与ASCII码。

检查系统设置:与语言有关的环境变量LANG应为en_US.UTF-8

  • env | grep LANG
  • 若有问题,设置方法为:export LANG=en_US.UTF-8

(7) 命令iconv

中文字符编码的转换

  • iconv -f gbk -t utf8  (from GBK to UTF8)
  • iconv -f utf8 -t gbk  (from UTF8 to GBK)
  • 例子:echo "汉字" | od -t x1        --->  查看编码为7位,最后一位为换行。但是转为gbk之后只有5位。

3 文件名和文件目录信息

3.1 文件和目录的命名规则

  • 一般允许1~255字符长度。
  • 除斜线外的所有字符都是命名的合法字符。
  • 另外字节0不能作为名称,应为0是字符串结束标志。
  • 斜线(/)留做路径名分割符。

3.2 系统配置信息

/etc 目录   

  • 供系统维护管理用的命令和配置文件,文件格式为文本文件。功能类似windows里面的注册表信息。
  • passwd 记录系统中所有用户的名称,用户的主目录以及登录后运行的shell。
  • hosts 存IP地址和文件名、域名的对应关系。
  • *.conf 配置文件。
  • rc*.d 系统启动阶段初始化和启动各服务的脚本。
  • profile/bash.bashrr 系统级bash等shell的偏好设置。
  • rc.local 自定义的需要自启动的服务脚本。

/tmp

  • 临时文件,每个用户都可以在这里临时创建文件,但只能删除自己的文件,不可以删除其他用户创建的文件。

/var

  • 系统运行时要改变的数据。
  • 系统日志syslog等。

3.3 可运行程序和设备文件

/bin

  • 系统常用命令,如 ls, ln, cp, cat 等

/usr/bin

  • 存放一些常用命令,如 ssh, ftp, make, gcc, git 等

/sbin, /usr/sbin

  • 系统管理员专用命令

/dev

  •  设备文件,如终端设备,磁带机,打印机等

3.4 头文件和库文件

/usr/include  (usr=Unix System Resourse)

  • C语言头文件存放目录

/lib, /usr/lib

  • 存放各种库文件,指C语言的链接库文件,以及terminfo终端库等等。
  • 静态链接库文件有.a后缀(archive,存档)。
  • 动态链接库文件后缀时.so(shared objects:共享的目标代码,多个.o文件的集成)。
  • Linux广泛使用动态链接库,静态链接库逐渐过时,使用动态链接库可以节省内存。

动态链接与静态链接

  • gcc hello.c -o hello               (7.2k)
  • gcc -static hello.c -o hello    (712k)

4 文件通配符规则

4.1 文件通配符

* 星号

  • 匹配任意长度的文件名字符串(包括空字符串)
  • 点字符(.),当它作为文件名或路径名分量的第一个字符时,必须显示匹配。例:*file匹配file, makefile, 不匹配.profile文件。
  • 斜线(/)也必须显示匹配。
  • 例:try*c 匹配try.c, tyy1.c等

?问号

  • 匹配任一单字符

[ ] 方括号

  • 匹配括号内任一字符,也可以用减号指定一个范围。
  • 例:[a-z]*    *.[ch]   [Mm]akefile

~ 波浪线

  • bash特有的。
  • ~ 当前用户的主目录(home)

. 点文件 / .. 点点文件

  • 当前目录与上级目录
  • 把 . 文件解释为当前目录,不是通配符处理程序完成的,来源于目录的存储结构。

4.2 文件通配符处理过程

(1)通配符处理流程

  • kernel 操作系统核心。管理系统资源(包括内存,磁盘等)运行在核心态;通过软件中断方式对用户态进程提供系统调用接口。
  • shell 是一个用户态进程,如/bin/bash;对用户提供命令界面;启动其他应用程序(ap)使用操作系统核心提供的功能:包括系统命令和用户编写的程序。

(2)程序获取命令行参数的方式

void main(int argc, char *argv[])   argv[]为指针数组,即数组的元素为指针;argc为元素的个数。

(3)shell 文件名通配符处理

文件名通配符的处理由shell完成,分三步:

  • 在shell提示符下,从键盘输入命令,被shell接受;
  • shell对所键入内容作若干加工处理,其中含有对文件通配符的展开工作(文件名生成),生成结果命令;
  • 执行前面生成的结果命令。

例1:设当前目录下只有try.c, zap.c, arc.c 三文件

  • 键入内容 cat *.c
  • 实际执行 cat arc.c  try.c  zap.c (按照字典顺序)
  • 对于命令cat而言,指定了3个文件,该命令不会知道键入的内容,只接收实际的执行命令。

例2:grep a*.c  try.c 与 grep 'a*.c' try.c 的区别

  • 假设当前目录下有a1.c和a2.c文件
  • 前者实际执行grep a1.c  a2.c  try.c。表示在a2.c和try.c中查找正则表达式 a2.c
  • 后者在try.c文件中查找正则表达式 a*.c

(4)验证文件通配符处理方式

UNIX由shell完成对文件通配符的展开,对于UNIX命令而言执行的则是通过通配符处理之后的完整的命令语句。

Windows由命令自身来解释文件通配符。

Guess you like

Origin blog.csdn.net/qq_38844835/article/details/121962207