Linux comm原理简介 (linux comm原理)

Linux comm 原理简介

在 Linux 操作系统中,comm 命令是一个用于比较两个已排序文件同和不同行的工具程序。通过使用该命令,用户可以方便地将两个文件彼此比较,找出它们之间的差异或者相似之处。本文将详细介绍 comm 命令的原理及其应用。

一、命令格式

comm 命令的基本语法如下:

$ comm [OPTION]… FILE1 FILE2

其中,OPTION 表示可选参数,FILE1 和 FILE2 分别代表需要比较的两个文件。

二、命令参数

comm 命令支持的主要参数如下:

* `-1`: 禁止输出 FILE1 中的只存在的行。

* `-2`: 禁止输出 FILE2 中的只存在的行。

* `-3`: 禁止输出 FILE1 和 FILE2 中重复的行。

* `-b`: 忽略文件中的空行。

* `-d`: 输出不同行的行号。

* `-i`: 比较时忽略大小写。

三、原理介绍

comm 命令主要是通过比较两个文件中的行来确定它们之间的相似性和不同之处。在 comm 命令中,比较分为三种类型,分别是之一个文件 FILE1 中的行、第二个文件 FILE2 中的行以及两个文件中相同的行。而这三种不同的行分别保存在不同的列中:

* 之一列: 只在 FILE1 中存在的行。

* 第二列: 只在 FILE2 中存在的行。

* 第三列: 在 FILE1 和 FILE2 中都存在的行。

针对每一行, comm 命令会根据这行在文件中出现的位置来确定是在之一个文件中出现的行、第二个文件中出现的行还是两个文件中都出现过的行。然后,该命令将这些行根据所在的文件进行分类,最后将它们打印到标准输出中。

四、示例应用

下面通过几个实例来演示 comm 命令的基本应用。

1. 列出两个文件的相同行

假设我们有两个文件,分别是 file1 和 file2。现在我们需要找出这两个文件中相同的行。可以使用如下命令:

$ comm file1 file2

执行该命令后,将在终端输出如下内容:

“`

this is a test file.

this is test file two.

hello world

this is a test file.

this is test file two.

This is the third line of file1.

This is the third line of file2.

“`

上述输出结果表明,file1 和 file2 中有两个相同的行: “this is a test file.” 和 “this is test file two.”。

2. 列出仅在一个文件中出现的行

有时候我们也需要找出只在一个文件中出现的行。 comm 命令提供了两种选项: `-1` 和 `-2`,可以用来输出仅在这些文件中的行。

示例命令:

$ comm -1 file1 file2

执行该命令后,将在终端输出如下行:

“`

Hello

This is the fourth line of file1.

“`

上述结果表明,file1 中仅有一行的内容 Hello 只在该文件中出现,而 file2 中不存在相同的行。

3. 列出不同文件中的行和行号

为了更好地追踪和比较文件之间的差异, comm 命令还可以将不同文件中的行输出到终端,并带上它们所处的行号。 使用命令选项 `-d` 可以获得不同行的行号。

示例命令:

$ comm -d file1 file2

执行该命令后,将在终端输出如下行:

“`

2 This is the fourth line of file1.

2 This is the fourth line of file2.

“`

上述结果表明,第四行在 file1 和 file2 中的内容不同,并且在这两个文件中的行号分别为 2。

四、

本文简要介绍了 Linux 中的 comm 命令的基本原理及其应用。通过不同的选项和参数, comm 命令可以帮助用户对比两个文件之间的相似性和差异,并输出这些不同之处的详细信息。 希望能对读者在使用 comm 命令时提供一定的参考。

相关问题拓展阅读:

Linux里面ps -eo comm,pcpu命令作用是什么?

# ps -ef 显示所有进程

# ps -eo comm,pcpu 显圆败示所有命令占用的cpu的大小

e显示所有进程,o指定命令的名字

# ps -eo comm,pmem 显示所有命令占用的mem的大小

ps工具标识进程的橘蚂颤5种状态码:

D 不可中断 uninterruptible sleep (usually IO)

R 运行 runnable (on run queue)

S 中断 sleeping

T 停止 traced or stopped

Z 僵死 a defunct (”zombie”物乎) process

LINUX的端口和服务有什么关系

LINUX的端口和服务

计算机实际上可以做的事情实质上非常凯神橡简单,比如计算两个数的和,再比如在内存中寻找到某个地址等等。这些最基础的计算机动作被称为指令 (instruction)。所谓的程序(program),就是这样一系列指令的所构成的。通过程序,我们可以让计算机完成复杂的操作。程序大多数时候被存储为可执行的文件。这样一个可执行文件就像是一个菜谱,计算机可以按照菜谱作出可口的饭菜。

那么,程序和进程(process)的区别又是什么呢?

进程是程序的一个具体实现。只有食谱没什么用,我们总要按照食谱的指点真正一步步实行,才能做出菜肴。进程是执行程序的过程,类似于按照食谱,真正去做菜的过程。同一个程序可以执行多次,每次都可以在内存中开辟独立的空间来装载,从而产生多个进程。不同的进程还可以拥有各自独立的IO接口。

操作系统的一个重要功能就是为进程提供方便,比如说为进程分配内存空间,管理进程的相关信息等等,就好像是为我们准备好了一个精美的厨房。

看一眼进程

首先,我们可以使用$ps命令来查询正在运行的进程,比如$ps -eo pid,comm,cmd,下图为执行结果:

(-e表示列出全部进程,-o pid,comm,cmd表示我们需要PID,COMMAND,CMD信息)

每一行代表了一个进程。每一行又分为三列。之一列PID(process IDentity)是一个整数,每一个进程都有一个唯一的PID来代表自己的身份,进程也可以根据PID来识别其他的进程。第二列COMMAND是这个进程的简称。第三列CMD是进程所对应的程序以及运行时所带的参数。

(第三列有一些由中括号括起来的。它们是kernel的一部分功能,被打扮成进程的样子以方便操作系统管理。我们不必考虑它们。)

我们看之一行,PID为1,名字为init。这个进程是执行/bin/init这一文件(程序)生成的瞎键。当Linux启动的时候,init是系统创建的之一个进程,这一进程会一直存在,直到我们关闭计算机。这一进程有特殊的重要性,我们会不断提到它。

如何创建一个进程

实际上,当计算机开机的时候,内核(kernel)只建立了一个init进程。Linux kernel并不提供直接建立新进程的系统调用。剩下的所有进程都是init进程通过fork机制建立的。新的进程要通过老的进程复制自身得到,这就是fork。fork是一个系统调用。进程存活于内存中。每个进程都在内存中分配有属于自己的一片空间 (address space)。当进程fork的时候,Linux在内存中开辟出一片新的内存空间给新的进程,并将老的进程空间中的内容复制到新的空间中,此后两个进程同时运行。

老进程成为新进程的父进程(parent process),而相应的,新进程就是老的进程的子进程(child process)。一个进程除了有一个PID之外,还会有一个PPID(parent PID)来存储的父进程PID。如果我们循着PPID不断向上追溯的话,总会发现其源头是init进程。所以说,所有的进程也构成一个以init为根的树状结构。

如下,我们查询当前shell下的进程:

代码如下:

root@vamei:~# ps -o pid,ppid,cmd

PID PPID CMD

sudo -i

bash

ps -o pid,ppid,cmd

我们可以看到,第二个进程bash是之一个进程sudo的子进程,而第三个进程ps是第二个进程的子进程。

还可以用$pstree命令来显示整个进程树:

代码如下:

init─┬─NetworkManager─┬─dhclient

│ └─2*

├─accounts-daemon───{accounts-daemon}

├─acpid

├─apache2─┬─apache2

│ └─2*>

├─at-spi-bus-laun───2*

├─atd

├─avahi-daemon──盯旁─avahi-daemon

├─bluetoothd

├─colord───2*

├─console-kit-dae───64*

├─cron

├─cupsd───2*

├─2*

├─dbus-launch

├─dconf-service───2*

├─dropbox───15*

├─firefox───27*

├─gconfd-2

├─geoclue-master

├─6*

├─gnome-keyring-d───7*

├─gnome-terminal─┬─bash

│ ├─bash───pstree

│ ├─gnome-pty-helpe

│ ├─sh───R───{R}

│ └─3*

fork通常作为一个函数被调用。这个函数会有两次返回,将子进程的PID返回给父进程,0返回给子进程。实际上,子进程总可以查询自己的PPID来知道自己的父进程是谁,这样,一对父进程和子进程就可以随时查询对方。

通常在调用fork函数之后,程序会设计一个if选择结构。当PID等于0时,说明该进程为子进程,那么让它执行某些指令,比如说使用exec库函数(library function)读取另一个程序文件,并在当前的进程空间执行 (这实际上是我们使用fork的一大目的: 为某一程序创建进程);而当PID为一个正整数时,说明为父进程,则执行另外一些指令。由此,就可以在子进程建立之后,让它执行与父进程不同的功能。

子进程的终结(termination)

当子进程终结时,它会通知父进程,并清空自己所占据的内存,并在kernel里留下自己的退出信息(exit code,如果顺利运行,为0;如果有错误或异常状况,为>0的整数)。在这个信息里,会解释该进程为什么退出。父进程在得知子进程终结时,有责任对该子进程使用wait系统调用。这个wait函数能从kernel中取出子进程的退出信息,并清空该信息在kernel中所占据的空间。但是,如果父进程早于子进程终结,子进程就会成为一个孤儿(orphand)进程。孤儿进程会被过继给init进程,init进程也就成了该进程的父进程。init进程负责该子进程终结时调用wait函数。

当然,一个糟糕的程序也完全可能造成子进程的退出信息滞留在kernel中的状况(父进程不对子进程调用wait函数),这样的情况下,子进程成为僵尸(zombie)进程。当大量僵尸进程积累时,内存空间会被挤占。

进程与线程(thread)

linux comm原理的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于linux comm原理,Linux comm原理简介,Linux里面ps -eo comm,pcpu命令作用是什么?,LINUX的端口和服务有什么关系的信息别忘了在本站进行查找喔。


数据运维技术 » Linux comm原理简介 (linux comm原理)