Linux中最常用的文件操作命令
仅个人想法,会持续不间断更新和改进。
文件操作,可查找、可搜索、可显示、可对比、可去伪存真,亦可左右逢源。
查看庐山真面貌的cat
cat命令可用于输出文件的内容到标准输出。
cat
的官方定义为:
concatenate files and print on the standard output
翻译过来就是:把档案串连接后传到基本输出
其用法一般为:$ cat [OPTION]… [FILE]…
cat
命令的可选参数[OPTION]
如下所示:
-n
或--number
: 由 1 开始对所有输出的行数编号-b
或--number-nonblank
: 和 -n 相似,只不过对于空白行不编号-s
或--squeeze-blank
:当遇到有连续两行以上的空白行,就代换为一行的空白行-T
或--show-tabs
:显示TAB字符,显示为^I
-E
或--show-ends
:显示行末符号,字符为$
-A
或--show-all
:显示所有的信息
此时假定我们的文件为hello.c,内容为最经典的:#include <stdio.h>
int main(int argc, char * argv[]){ printf(“Hello World\n”); return 0;}
接下来的实例全部根据这个文件展开,Hello World. Hello Linux
实例 :简单显示内容
$ cat hello.c
#include <stdio.h>
int main(int argc, char * argv[]){printf(“Hello World\n”); return 0;}
实例 :显示行号 -n
$ cat -n hello.c
1 #include <stdio.h> 2 3 int main(int argc, char * argv[]) 4 { 5 printf(“Hello World\n”); 6 7 return 0; 8 }
实例 : 显示行末
$ cat -E hello.c #include <stdio.h>$$int main(int argc, char * argv[])${$printf(“Hello World\n”);$ $return 0;$}$
实例:显示空白字符
cat -T hello.c #include <stdio.h>
int main(int argc, char * argv[]){^Iprintf(“Hello World\n”);^I ^Ireturn 0;}
此时可以看到^I,which means Tab charcter.
加一个管道
比如,此时希望看到你的源码文件一共多少行,每行代表什么意思,就可以把含有行号的输入通过管道发送到另外一个文件,如下所示:$ cat -n hello.c > hello_number.c
$ cat hello_number.c
1 #include <stdio.h> 2 3 int main(int argc, char * argv[]) 4 { 5 printf(“Hello World\n”); 6 7 return 0; 8 }
其他的一些选项可以自行尝试。
反向显示之 tac
tac
命令将文件反向输出,刚好与前面的cat
输出相反,cat
命令可用于输出文件的内容到标准输出。
这个命令其实就是cat
的反向输出,😁。
tac
的官方定义为:
tac
– concatenate and print files in reverse
其用法一般为:$ tac [OPTION]… [FILE]…
tac
命令的可选参数[OPTION]
如下所示:
-b
,--before
:在行前而不是行尾添加分割标志-r
,--regex
:将分割标志作为正则表达式来解析-s
,--separator=STRING
:使用STRING
作为分割标志
同样使用前面的hello.c文件,内容为:#include <stdio.h>
int main(int argc, char * argv[]){ printf(“Hello World\n”); return 0;}
接下来的实例全部根据这个文件展开,Hello World. Hello Linux
显示内容
与cat比对输出如下所示:$ cat hello.c #include <stdio.h>
int main(int argc, char * argv[]){ printf(“Hello World\n”);
return 0;}
$ tac hello.c} return 0;
printf(“Hello World\n”);{int main(int argc, char * argv[])
#include <stdio.h>
其他几个参数用的到时不多,不过搭配起来还是有一些帮助的,比如做一个反序输出,搭配使用-s
和-r
参数,如下:$ cat ‘Hello World.’ | tac -r -s “.”.dlroW olleH
这个方法就用到了管道、正则表达式。
且看迥然不同的 diff
Linux diff
命令用于比较文件的差异。
当然还有很多比较文件的专业工具,但是如果在Linux命令行,这个是最原始最初的,也是开机即用的。
官方定义为:
GNU diff – compare files line by line
diff
会以逐行的方式,比较文本文件的不同。
如果指定要比较目录,则 diff
会比较目录中相同文件名的文件,但不会比较其中子目录。
语法
$ diff [OPTION]… FILES
参数:
-c
显示所有内容,并标出不同之处。-u
以合并的方式来显示文件内容的不同。-y
或--side-by-side
两列输出显示文件的异同之处。
假定有两个文件a和b,内容分别为:$ cat aThis is a.Hello a.Hello World.
$ cat bThis is b.Hello b.Hello World.
默认比较两个文件
默认情况下,直接输入下面命令即可:$ diff a b1,2c1,2< This is a.< Hello a.—> This is b.> Hello b.3a4> One more line.
可以看到1,2c1,2,中间有一个字母c;3a4,中间有一个字母a。
那么a和c什么含义呢,中间的字母表示需要在第一个文件上做的操作(a=add,c=change,d=delete),然后才有后面的文件一致。
所以1,2c1,2表示1,2行更换后一致;3a4表示,增加一行后一致。
并排显示方便比较
这种方式相对而言,就很亲民了,左右两边两列方便比对。$ diff a b -yThis is a. | This is b.Hello a. | Hello b.Hello World. Hello World. > One more line.
那么:
- “|”表示前后2个文件内容有不同;
- “<“表示后面文件比前面文件少了1行内容
- “>”表示后面文件比前面文件多了1行内容
context模式比较
这种模式会输出所有的文件内容,并显示不同之处,还包括具体的时间。
如下***
表示a的内容,---
表示b的内容。$ diff a b -c*** a 2013-03-04 23:20:20.322345200 +0800— b 2013-03-04 23:26:30.712130000 +0800****************** 1,3 ****! This is a.! Hello a. Hello World.— 1,4 —-! This is b.! Hello b. Hello World.+ One more line.
unified模式比较
这种模式会混合输出所有的文件内容,并显示不同之处,还包括具体的时间。
如下---
表示a的内容,+++
表示b的内容。$ diff a b -u— a 2013-03-04 23:20:20.322345200 +0800— b 2013-03-04 23:26:30.712130000 +0800@@ -1,3 +1,4 @@-This is a.-Hello a.+This is b.+Hello b. Hello World.+One more line.
对比时忽略空格
# diff -w name_list.txt name_list_new.txt
2c2,3< John Doe — > John M Doe> Jason Bourne
title: 从头开始的head tags:
- linux
- head
- 文档查看
- 文件操作 categories:
- Linux入门 date: 2012-02-12 22:11:00
从头开始的head
head
命令用来查看文件头部的n行,如果没有指定的n,默认显示10行。
官方定义:
head – output the first part of files
命令格式
$ head [option] [filename]
参数option比较常用的如下所示:
-c <数目>
显示的字节数-n <行数>
显示文件的头部 n 行内容
常规使用
假定文件 text.txt 有 20 行,从 1-20 ,默认情况下的使用如下,显示前面的10行:$ head text.txt12345678910
显示 前 N 行
显示 text.txt 文件的开头 5 行,可以输入以下命令:$ head -n 5 text.txt
按照字节显示
显示文件前 20 个字节:$ head -c 20 text.txt123456789
你是唯一的 uniq
Linux uniq
命令用于检查及删除文本文件中重复出现的行列,一般与 sort
命令结合使用。
官方定义为:
uniq
– report or omit repeated lines
uniq 可检查文本文件中重复出现的行列。
语法
语法比较简单,直接用就可以。$ uniq [OPTION]… [INPUT [OUTPUT]]
常用的参数为:
-c
或--count
在每列旁边显示该行重复出现的次数。-d
或--repeated
仅显示重复出现的行列。-u
或--unique
仅显示出一次的行列。
假定有1个文件为testfile,内容如下:testfile Hello 1 Hello 2 Hello 2 Hello 3 Hello 3 Hello 3 Hello 4 Hello 4 Hello 4 Hello 4
默认无参数
使用uniq 命令可以删除重复的行,不管有多少重复的行,仅仅显示一行。$ uniq testfileHello 1Hello 2Hello 3Hello 4
统计出现频次
如果希望统计每一行出现的频次,可以使用-c
参数,其中第一行输出为出现的次数$ uniq -c testfile 1 Hello 1 2 Hello 2 3 Hello 3 4 Hello 4
仅仅显示重复的行
在某些情况下,或许只想看到有重复的列,使用-d
参数 :$ uniq -d testfileHello 2Hello 3Hello 4
仅仅显示不重复的行
而某些情况下,或许只想看到不重复的列,使用-u
参数:$ uniq -u testfileHello 1
精准快速定位的locate
Linux locate
命令用于查找符合条件的文档、程序、目录等等。这个命令会在数据库中查找符合条件的各种信息。
一般情况我们只需要输入 locate name
即可查找。
官方定义为:
locate
– list files in databases that match a pattern
使用方法为:$ locate [-d path | –database=path] [-e | -E | –[non-]existing] [-i | –ignore-case] [-0 | –null] [-c | –count] [-w | –wholename] [-b | –basename] [-l N | –limit=N] [-S | –statistics] [-r | –regex ] [–regex‐ type R] [–max-database-age D] [-P | -H | –nofollow] [-L | –follow] [–version] [-A | –all] [-p | –print] [–help] pattern…
看着很复杂,不过常用的参数倒是不多,基本为:
-n
: 至多显示 n个输出。-i, --ignore-case
: 忽略大小写
默认无参数
默认情况下,locate
直接跟上需要查找的信息就可以了,如下所示:$ locate set_vis.cpp/home/user/mycode/src/set_vis.cpp
# 以查找apropos为例$ locate apropos/usr/bin/apropos/usr/local/difmap/help/apropos.hlp/usr/share/emacs/24.3/lisp/apropos.elc/usr/share/man/de/man1/apropos.1.gz/usr/share/man/es/man1/apropos.1.gz/usr/share/man/fr/man1/apropos.1.gz/usr/share/man/id/man1/apropos.1.gz/usr/share/man/it/man1/apropos.1.gz/usr/share/man/ja/man1/apropos.1.gz/usr/share/man/man1/apropos.1.gz/usr/share/man/nl/man1/apropos.1.gz/usr/share/man/pl/man1/apropos.1.gz/usr/share/man/ru/man1/apropos.1.gz
太多需要简单化
如果输出的信息很多,仅仅希望看到前面的几个,使用-n
参数既可# 仅仅查看前的3个$ locate -n 3 apropos/usr/bin/apropos/usr/local/difmap/help/apropos.hlp/usr/share/emacs/24.3/lisp/apropos.elc
不区分大小写
部分情况下,可能有大小写混淆的情况,此时使用-i
参数既可$ $ locate -i set_vis.cpp/home/user/mycode/src/set_vis.cpp/home/user/mycode_CPP/src/set_VIS.cpp
📖 说明
不过刚按照的系统,这个命令并不一定有输出,主要是因为locate
与 find
不同, find
直接在硬盘找,而locate
只在数据库中查找。
这个数据库在CentOS系统默认的为 /var/lib/mlocate/mlocate.db 中,所以locate
的查找会比较快,但并一定是实时的,而是以数据库的更新为准。
可以通过下面的命令手工升级数据库 ,命令为:$ updatedb
然后就可以使用了。
不可狗尾续貂的tail
tail
命令用来查看文件尾部的n行,如果没有指定的n,默认显示10行。
命令格式:$ tail [option] [filename]
参数option比较常用的如下所示:
-f
循环读取-c <数目>
显示的字节数-n <行数>
显示文件的尾部 n 行内容
常规使用
假定文件text.txt有20行,从1-20,默认情况下的使用如下:$ tail text.txt11121314151617181920
显示N行
可以通过-n参数来只显示N行,而不是默认的10行,比如15行,如下:$ tail -n 15 text.txt67891011121314151617181920
从第N行显示
此时如果希望从第N行显示,而不是显示N行,可以通过下面的参数,比如从第15行显示$ tail -n +15 text.txt151617181920
按照字符显示
如果希望显示文件的最后几个字符,比如6个,如下:$ tail -c 6 text.txt1920
# NICE# 查看文件的后60KB$ tail -c 60k filename# 查看文件的后60MB$ tail -c 60m filename
特别赞的一个实时更新的功能
参数 -f
常常用于查阅正在改变的日志文件。如下面👇所示:$ tail -f filename
如果filename的内容在增加,那么显示在屏幕上的内容就会一直更新。
声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/389603.html