Linux中最常用的文件操作命令

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

📖 说明

不过刚按照的系统,这个命令并不一定有输出,主要是因为locatefind 不同, 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

(0)
联系我们
联系我们
分享本页
返回顶部