Linux 求出两个文件的差别:diff命令介绍

Linux diff命令用于比较文件的差异。

diff以逐行的方式,比较文本文件的异同处。如果指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录。

diff 命令是一个分析文件信息的命令,可以打印出文件之间的差异。它可以逐行地比较两个文件的内容,也可以递归地比较文件夹的内容。diff 命令的输出内容可以让我们知道要使两个文件相同需要做哪些修改,这对于我们的工作很有帮助。

用法

1
2
diff file1 file2
diff –u file1 file2

功能

  • 比较两个版本的文本文件,以寻找两者间差别

输出格式

  • normal,
  • unified (-u)

normal格式

normal格式:列出一个如何将原文件file1转化为新文件file2的指令

  • 这些指令有
    • a(Add),
    • c(Change)
    • d(Delete)
  • 指令字母左边的行号是file1的行号,右面是file2的行号
  • 列出内容时,
    • 大于号后边的内容是需要在file1文件中增加的内容;
    • 小于号后边的内容是需从file1中删除的内容

normal格式文件转化指令

更换指令c

25c25,26
< #define MAX_WEIGHT 2000000000 
---
> /* max signed 32-bit integer */
> #define MAX_WEIGHT 0x7fffffff

将原文件file1的第25行更换(change)成新文件file2的的第25~26行。

删除指令d

61,62d60
<                 x2 = ht[j].weight;
<                 m2 = j;

将原文件file1第6l~62行删除(delete)后,后面的内容与新文件file2的第60行之后一致

增加指令a

68a67,68
>         ht[i].parent = -1;
>         printf("Create new tree\n");

将原文件file1的第68行增加(add)新文件file2中的第67~68行

unified格式

unified在git中使用的就是这种格式。

$ diff -u0 ht.c ht2.c 
--- ht.c 2018-11-14 18:18:59.595497610 +0800
+++ ht2.c       2018-11-17 08:22:58.191858259 +0800
@@ -25 +25,2 @@
-#define MAX_WEIGHT 2000000000 
+/* max signed 32-bit integer */
+#define MAX_WEIGHT 0x7fffffff
@@ -50,2 +51 @@
- x1 = x2 = MAX_WEIGHT;
- m1 = m2 = 0;
+        x1 = MAX_WEIGHT;
@@ -61,2 +60,0 @@
- x2 = ht[j].weight;
- m2 = j;
@@ -68,0 +67,2 @@
+        ht[i].parent = -1;
+        printf("Create new tree\n");

以下的信息表示两个文件差异的内容:

1
2
3
4
@@ -25 +25,2 @@
-&#35;define MAX_WEIGHT 2000000000
+/* max signed 32-bit integer */
+&#35;define MAX_WEIGHT 0x7fffffff

表示删除第一个文件ht.c第25行的内容,然后在第25行添加两行新内容。

1
2
3
4
@@ -50,2 +51 @@
- x1 = x2 = MAX_WEIGHT;
- m1 = m2 = 0;
+ x1 = MAX_WEIGHT;

删除第一个文件的50行之后的两行内容。然后在第51行添加一行内容。

1
2
3
@@ -61,2 +60,0 @@
- x2 = ht[j].weight;
- m2 = j;

删除第一个文件第61行之后的两行内容

1
2
3
@@ -68,0 +67,2 @@
+ ht[i].parent = -1;
+ printf("Create new tree\n");

在第67行后添加两行内容。

diff 标准输出

[root@localhost cmp]# cat -n a.txt 
     1    this is line a
     2    this is line b
     3    helloworld!
     4    this is line d
     5    this is a new line
[root@localhost cmp]# cat -n b.txt 
     1    this is line a
     2    this is line b
     3    this is line c
     4    this is line d
[root@localhost cmp]# diff a.txt b.txt 
3c3
< helloworld!
---
> this is line c
5d4
< this is a new line
[root@localhost cmp]# 

diff命令输出信息

diff 命令所参考的不是第一个文件,而是第二个文件,它的输出信息有以下几种字符:

  • a : 表示必须文件1必须 添加一行 才能和文件2相同
  • c : 表示必须文件1必须 修改行 才能和文件2相同
  • d : 表示必须文件1必须 删除一行 才能和文件2相同
  • 字符前的数字表示第一个文件中的行数,
  • 字符后的内容表示第二个文件中的行数。
  • < 表示引用的第一个文件中的内容,
  • > 表示引用的第一个文件中的内容。

所以上面的输出信息的含义如下:

3c3              # 根据第2个文件b.txt的第3行,第一个文件a.txt的第3行需要改变的内容,我猜这里的c应该是change的意思
< helloworld!    # 第1个文件a.txt的第3行的内容
---              # 分隔符
> this is line c # 第2个文件b.txt的第3行的内容
5d4              # 根据第2个文件的第4行,第一个文件a.txt的第5行需要删除掉的内容
< this is a new line

diff a.txt b.txt

[root@localhost cmp]# diff a.txt b.txt 
3c3
< helloworld!
---
> this is line c
5d4
< this is a new line
[root@localhost cmp]# 

为了使得a.txt和b.txt相同,我们必须

  • 修改a.txt的第3行的内容。(3c3)
  • 删除a.txt的第5行的内容。(5d4)

diff b.txt a.txt

现在调换两个文件的位置,输出如下:

[root@localhost cmp]# diff b.txt a.txt 
3c3
< this is line c
---
> helloworld!
4a5
> this is a new line
[root@localhost cmp]# 

可以看到如果要使得b.txt和a.txt内容一样。

  • 修改b.txt的 第3行的内容。
  • 在b.txt的第4行之后添加内容。

diff -c:上下文格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost cmp]# diff -c a.txt b.txt 
*** a.txt 2021-05-19 11:45:23.117869628 +0800
--- b.txt 2021-05-15 22:41:56.157986437 +0800
***************
*** 1,5 ****
this is line a
this is line b
! helloworld!
this is line d
- this is a new line
--- 1,4 ----
this is line a
this is line b
! this is line c
this is line d
[root@localhost cmp]#

diff -c输出信息

其中

1
*** a.txt    2021-05-19 11:45:23.117869628 +0800

表示文件a.txt的信息用星号表示

1
--- b.txt    2021-05-15 22:41:56.157986437 +0800

表示b.txt的信息用减号表示

1
*** 1,5 ****   表示下方是a.txt的第1到第5行的内容
1
--- 1,4 ----  表示下方是b.txt的第1到第4行的内容。

行前有感叹号 表示 该行 需要修改

1
! helloworld!

1
! this is line c

表示要使得a.txt与b.txt内容一样,需要修改helloworld为this is line c.

行前有减号 表示改行需要删除

1
- this is a new line

表示要使得a.txt与b.txt内容一样,该行需要删除掉。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost cmp]# diff -c b.txt a.txt 
*** b.txt 2021-05-15 22:41:56.157986437 +0800
--- a.txt 2021-05-19 11:45:23.117869628 +0800
***************
*** 1,4 ****
this is line a
this is line b
! this is line c
this is line d
--- 1,5 ----
this is line a
this is line b
! helloworld!
this is line d
+ this is a new line
[root@localhost cmp]#

行前有加号表示需要添加改行

1
+ this is a new line

表示要使得b.txt比a.txt多了

1
this is a new line

这一行

diff -u:统一格式输出

统一输出格式是上下文格式的改进版本,并产生较小的输出。
使用-u选项告诉diff以统一格式打印输出:

1
2
3
4
5
6
7
8
9
10
11
[root@localhost cmp]# diff -u a.txt b.txt 
--- a.txt 2021-05-19 11:45:23.117869628 +0800
+++ b.txt 2021-05-15 22:41:56.157986437 +0800
@@ -1,5 +1,4 @@
this is line a
this is line b
-helloworld!
+this is line c
this is line d
-this is a new line
[root@localhost cmp]#

表示把b.txt的

1
helloworld!

这样修改为

1
this is line c

,然后删除

1
this is a new line

即可得到a.txt

diff命令手册

man diif

https://manned.org/diff.1

tldr diif

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[root@localhost cmp]# tldr diff
diff

Compare files and directories.
More information: https://man7.org/linux/man-pages/man1/diff.1.html.

- Compare files (lists changes to turn old_file into new_file):
diff old_file new_file

- Compare files, ignoring white spaces:
diff -w old_file new_file

- Compare files, showing the differences side by side:
diff -y old_file new_file

- Compare files, showing the differences in unified format (as used by git diff):
diff -u old_file new_file

- Compare directories recursively (shows names for differing files/directories as well as changes made to files):
diff -r old_directory new_directory

- Compare directories, only showing the names of files that differ:
diff -rq old_directory new_directory

[root@localhost cmp]#

cheat diff

[root@localhost ~]# cheat diff
# To view the differences between two files:
diff -u version1 version2

# To view the differences between two directories:
diff -ur folder1/ folder2/

# To ignore the white spaces:
diff -ub version1 version2

# To ignore the blank lines:
diff -uB version1 version2

# To ignore the differences between uppercase and lowercase:
diff -ui version1 version2

# To report whether the files differ:
diff -q version1 version2

# To report whether the files are identical:
diff -s version1 version2

# To diff the output of two commands or scripts:
diff <(command1) <(command2)

# Generate a patch file from two files
diff -Naur version1 version2 > version.patch
[root@localhost ~]# 

参考资料

http://www.weixueyuan.net/a/550.html
https://segmentfault.com/a/1190000023138544
https://www.myfreax.com/diff-command-in-linux/
https://segmentfault.com/a/1190000039105296
https://www.jianshu.com/p/6ee74c2790b1
https://codingdict.com/article/10090
http://blog.itpub.net/29270124/viewspace-2220511/
https://os.51cto.com/art/201311/418930.htm

md5sum/sha1sum:文件内容比较

  • 使用MD5算法(散列函数)根据文件内容生成16字节hash值,比较hash值是否相
    同,就可断定两文件内容是否完全相同,(md5sum命令)
  • 使用SHA-1算法的命令名为sha1sum (20字节hash值)
  • 其他散列函数也可以用来完成这一任务: sha512sum

md5算法常用于数据完整性(Data Integrity)验证和判断位于网络不同机器上的两个文件的内容是否相同。例如网上给出的安装程序经常会给出对应的md5值,我们可以对下载的安装程序计算md5值,如果我们计算的md5值与官网给出的md5值相同,则表示该安装程序没有被第三方篡改过,是安全的。

md5sum

测试文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost cmp]# cat -n a.txt 
1 this is line a
2 this is line b
3 helloworld!
4 this is line d
[root@localhost cmp]# cat -n b.txt
1 this is line a
2 this is line b
3 this is line c
4 this is line d
[root@localhost cmp]# cat -n c.txt
1 this is line a
2 this is line b
3 helloworld!
4 this is line d
[root@localhost cmp]#

可看到a.txt与c.txt的内容是相同的。
对着三个文件执行md5sum命令:

[root@localhost cmp]# md5sum a.txt 
abd3291ec48e1700a70d39ee5db7fb7d  a.txt
[root@localhost cmp]# md5sum b.txt 
bf56342c3e159e45ea1e434122410291  b.txt
[root@localhost cmp]# md5sum c.txt 
abd3291ec48e1700a70d39ee5db7fb7d  c.txt
[root@localhost cmp]# 

可以看到a.txt和c.txt的计算结果都是:abd3291ec48e1700a70d39ee5db7fb7d所以,这两个文件是相同的。

md5sum -c md5文件:读取MD5SUM的文件并验证所有文件是否具有匹配的校验和

测试文件:

1
2
3
4
5
6
7
8
9
10
11
[root@localhost cmp]# cat -n a.txt 
1 this is line a
2 this is line b
3 helloworld!
4 this is line d
[root@localhost cmp]# cat -n b.txt
1 this is line a
2 this is line b
3 this is line c
4 this is line d
[root@localhost cmp]#

计算这两个文件的md5值,保存到文件中:

1
2
3
4
[root@localhost cmp]# md5sum a.txt b.txt
abd3291ec48e1700a70d39ee5db7fb7d a.txt
bf56342c3e159e45ea1e434122410291 b.txt
[root@localhost cmp]# md5sum a.txt b.txt >a_b.md5

修改a.txt文件,在末尾加入一行:

1
2
3
4
5
6
7
8
[root@localhost cmp]# vim a.txt 
[root@localhost cmp]# cat a.txt
this is line a
this is line b
helloworld!
this is line d
this is some new word
[root@localhost cmp]#

执行md5校验:

1
2
3
4
5
[root@localhost cmp]# md5sum -c a_b.md5
a.txt: 失败
b.txt: 确定
md5sum: 警告:1 个校验和不匹配
[root@localhost cmp]#

可以看到我们修改a.txt后,该文件md5校验失败,这表示a.txt文件被篡改了。

md5sum命令手册

tldr md5sum

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost cmp]# tldr md5sum

md5sum

计算 MD5 加密校验和.
更多信息: https://www.gnu.org/software/coreutils/md5sum.

- 计算文件的 MD5 校验和:
md5sum filename1

- 计算多个文件的 MD5 校验和:
md5sum filename1 filename2

- 读取 MD5SUM 的文件并验证所有文件是否具有匹配的校验和:
md5sum -c filename.md5

[root@localhost cmp]#

sha1sum

sha1sum file:计算文件的SHA1校验和

测试文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost cmp]# cat -n a.txt 
1 this is line a
2 this is line b
3 helloworld!
4 this is line d
[root@localhost cmp]# cat -n b.txt
1 this is line a
2 this is line b
3 this is line c
4 this is line d
[root@localhost cmp]# cat -n c.txt
1 this is line a
2 this is line b
3 helloworld!
4 this is line d
[root@localhost cmp]#

计算sha1校验和:

[root@localhost cmp]# sha1sum a.txt 
01c3d325eeca7f806192dddbfa9ce791cb5c6fc7  a.txt
[root@localhost cmp]# sha1sum b.txt 
1cb5cee11036b493799b8b1b0d6ea9704e84c282  b.txt
[root@localhost cmp]# sha1sum c.txt 
01c3d325eeca7f806192dddbfa9ce791cb5c6fc7  c.txt
[root@localhost cmp]# 

可以看到a.txt和c.txt的校验和是一样的,所以这两个文件的内容相同。

sha1sum 多个文件:计算多个文件的SHA1校验和

1
2
3
4
5
[root@localhost cmp]# sha1sum a.txt b.txt c.txt
01c3d325eeca7f806192dddbfa9ce791cb5c6fc7 a.txt
1cb5cee11036b493799b8b1b0d6ea9704e84c282 b.txt
01c3d325eeca7f806192dddbfa9ce791cb5c6fc7 c.txt
[root@localhost cmp]#

sha1sum –check file.sha1:检查文件是否被篡改

测试文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost cmp]# cat -n a.txt 
1 this is line a
2 this is line b
3 helloworld!
4 this is line d
[root@localhost cmp]# cat -n b.txt
1 this is line a
2 this is line b
3 this is line c
4 this is line d
[root@localhost cmp]# sha1sum a.txt b.txt
01c3d325eeca7f806192dddbfa9ce791cb5c6fc7 a.txt
1cb5cee11036b493799b8b1b0d6ea9704e84c282 b.txt
[root@localhost cmp]#

生成SHA1校验和文件:

1
[root@localhost cmp]# sha1sum a.txt b.txt > a_b.sha1

修改文件:

1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost cmp]# cat -n a.txt 
1 this is line a
2 this is line b
3 helloworld!
4 this is line d
5 this is a new line
[root@localhost cmp]# cat -n b.txt
1 this is line a
2 this is line b
3 this is line c
4 this is line d
[root@localhost cmp]#

检查所有文件的SHA1校验和:

1
2
3
4
5
[root@localhost cmp]# sha1sum --check a_b.sha1 
a.txt: 失败
b.txt: 确定
sha1sum: 警告:1 个校验和不匹配
[root@localhost cmp]#

可以看到a.txt校验失败了,这说明a.txt被修改过了。

sha1sum -c filename.sha1

上面的–check参数可以简写为-c:

1
2
3
4
5
[root@localhost cmp]# sha1sum -c a_b.sha1 
a.txt: 失败
b.txt: 确定
sha1sum: 警告:1 个校验和不匹配
[root@localhost cmp]#

sha1sum –check –quiet file.sha1:只显示SHA1校验和失败的文件

1
2
3
4
5
Try 'sha1sum --help' for more information.
[root@localhost cmp]# sha1sum --check --quiet a_b.sha1
a.txt: 失败
sha1sum: 警告:1 个校验和不匹配
[root@localhost cmp]#

sha1sum -c –quiet filename.sha1

--check可以简写为-c,不过需要注意的是--quiet参数不能省略:

1
2
3
4
5
6
7
8
9
10
[root@localhost cmp]# sha1sum --check --quiet a_b.sha1 
a.txt: 失败
sha1sum: 警告:1 个校验和不匹配
[root@localhost cmp]# sha1sum -c --quiet a_b.sha1
a.txt: 失败
sha1sum: 警告:1 个校验和不匹配
[root@localhost cmp]# sha1sum -c -q a_b.sha1
sha1sum:无效选项 -- q
Try 'sha1sum --help' for more information.
[root@localhost cmp]#

sha1sum命令手册

tldr sha1sum

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
[root@localhost cmp]# tldr sha1sum

sha1sum

Calculate SHA1 cryptographic checksums.
More information: https://www.gnu.org/software/coreutils/sha1sum.

- Calculate the SHA1 checksum for a file:
sha1sum filename1

- Calculate SHA1 checksums for multiple files:
sha1sum filename1 filename2

- Calculate and save the list of SHA1 checksums to a file:
sha1sum filename1 filename2 > filename.sha1

- Read a file of SHA1 sums and verify all files have matching checksums:
sha1sum --check filename.sha1

- Only show a message for files for which verification fails:
sha1sum --check --quiet filename.sha1

[root@localhost cmp]#

sha1sum –help

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[root@localhost cmp]# sha1sum --help
用法:sha1sum [选项]... [文件]...
显示或检查 SHA1(160-bit) 校验和。
若没有文件选项,或者文件处为"-",则从标准输入读取。

-b, --binary 以二进制模式读取
-c, --check 从文件中读取SHA1 的校验值并予以检查
--tag create a BSD-style checksum
-t, --text 以纯文本模式读取(默认)
Note: There is no difference between binary and text mode option on GNU system.

The following four options are useful only when verifying checksums:
--quiet don't print OK for each successfully verified file
--status don't output anything, status code shows success
--strict exit non-zero for improperly formatted checksum lines
-w, --warn warn about improperly formatted checksum lines

--help 显示此帮助信息并退出
--version 显示版本信息并退出

The sums are computed as described in FIPS-180-1. When checking, the input
should be a former output of this program. The default mode is to print
a line with checksum, a character indicating input mode ('*' for binary,
space for text), and name for each FILE.

GNU coreutils online help: <http://www.gnu.org/software/coreutils/>
请向<http://translationproject.org/team/zh_CN.html> 报告sha1sum 的翻译错误
要获取完整文档,请运行:info coreutils 'sha1sum invocation'
[root@localhost cmp]#

man sha1sum

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
SHA1SUM(1)                                                            User Commands                                                           SHA1SUM(1)

NAME
sha1sum - compute and check SHA1 message digest

SYNOPSIS
sha1sum [OPTION]... [FILE]...

DESCRIPTION
Print or check SHA1 (160-bit) checksums. With no FILE, or when FILE is -, read standard input.

-b, --binary
read in binary mode

-c, --check
read SHA1 sums from the FILEs and check them

--tag create a BSD-style checksum

-t, --text
read in text mode (default)

Note: There is no difference between binary and text mode option on GNU system.

The following four options are useful only when verifying checksums:
--quiet
don't print OK for each successfully verified file

--status
don't output anything, status code shows success

--strict
exit non-zero for improperly formatted checksum lines

-w, --warn
warn about improperly formatted checksum lines

--help display this help and exit

--version
output version information and exit

The sums are computed as described in FIPS-180-1. When checking, the input should be a former output of this program. The default mode is to
print a line with checksum, a character indicating input mode ('*' for binary, space for text), and name for each FILE.

GNU coreutils online help: <http://www.gnu.org/software/coreutils/> Report sha1sum translation bugs to <http://translationproject.org/team/>

AUTHOR
Written by Ulrich Drepper, Scott Miller, and David Madore.

COPYRIGHT
Copyright © 2013 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

SEE ALSO
The full documentation for sha1sum is maintained as a Texinfo manual. If the info and sha1sum programs are properly installed at your site, the
command

info coreutils 'sha1sum invocation'

should give you access to the complete manual.

GNU coreutils 8.22 November 2020 SHA1SUM(1)

hash算法失误率

MD5: $2^{-128} =3.4×10^{-38}$
SHA-1: $2^{-160} =4.7×10^{-50}$

参考资料

cmp命令

用法

1
cmp file1 file2

功能

  • 逐字节比较两个文件是否完全相同
  • 两个文件完全相同时,不给出任何提示
  • 两个文件不同时,打印出第一个不同之处
  • 在Windows中有类似的命令COMP

cmp命令用来比较两个文件是否有差异。

  • 当相互比较的两个文件完全一样时,则该指令不会显示任何信息。
  • 若发现有差异,预设会标示出第一个不通之处的字符和列数编号。
  • 若不指定任何文件名称或是所给予的文件名为“-”,则cmp指令会从标准输入设备读取数据。

cmp命令示例

查找两个文件之间的第一个差异的字节和行号

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost cmp]# cat -n a.txt 
1 this is line a
2 this is line b
3 helloworld!
4 this is line d
[root@localhost cmp]# cat -n b.txt
1 this is line a
2 this is line b
3 this is line c
4 this is line d
[root@localhost cmp]# cmp a.txt b.txt
a.txt b.txt 不同:第 31 字节,第 3 行
[root@localhost cmp]#

cmp -b:显示差异处的十进制字码和对应字符

[root@localhostf cmp]# cat -n a.txt 
     1	this is line a
     2	this is line b
     3	helloworld!
     4	this is line d
[root@localhost cmp]# cat -n b.txt 
     1	this is line a
     2	this is line b
     3	this is line c
     4	this is line d
[root@localhost cmp]# cmp -b a.txt b.txt 
a.txt b.txt 不同:第 3 行,第 31 字节为 150 h 164 t
[root@localhost cmp]# 

cmp -l:显示出所有不一样的字节

[root@localhost cmp]# cat -n a.txt 
     1	this is line a
     2	this is line b
     3	helloworld!
     4	this is line d
[root@localhost cmp]# cat -n b.txt 
     1	this is line a
     2	this is line b
     3	this is line c
     4	this is line d
[root@localhost cmp]# cmp -l a.txt b.txt 
31 150 164
32 145 150
33 154 151
34 154 163
35 157  40
36 167 151
37 157 163
38 162  40
40 144 151
41  41 156
42  12 145
43 164  40
44 150 143
45 151  12
46 163 164
47  40 150
51 154 151
52 151 163
53 156  40
54 145 154
55  40 151
56 144 156
57  12 145
cmp:a.txt 已结束

cmp -l输出详解

cmp -l的输出有3列,

  • 第1列表示两个文件开始不同的字节序号,也就是具体从第几个字节开始不同。
  • 第2列表示文件a.txt当前的字节
  • 第3行表示文件b.txt当前的字节

当然光看字节,我们难以理解,可以加上-b选项同时显示对应的字符:

[root@localhost cmp]# cmp -bl a.txt b.txt 
31 150 h    164 t
32 145 e    150 h
33 154 l    151 i
34 154 l    163 s
35 157 o     40  
36 167 w    151 i
37 157 o    163 s
38 162 r     40  
40 144 d    151 i
41  41 !    156 n
42  12 ^J   145 e
43 164 t     40  
44 150 h    143 c
45 151 i     12 ^J
46 163 s    164 t
47  40      150 h
51 154 l    151 i
52 151 i    163 s
53 156 n     40  
54 145 e    154 l
55  40      151 i
56 144 d    156 n
57  12 ^J   145 e
cmp:a.txt 已结束
[root@localhost cmp]# 

可以看到a.txt和b.txt这两个文件从第31个字节处开始不同:

  • a.txt的第31个字节是150,对应的是字符h。
  • b.txt的第31个字节是164,对应的是字符t。

cmp -s:只比较不显示消息,以命令返回值表示

这样,如果文件相同,则给出值 0,如果不同,则给出值 1,或者如果发生错误,则给出值 2。该命令形式通常用在 shell 步骤中。例如:

1
2
3
4
if cmp  -s prog.c.bak prog.c
then
echo 没有改变
fi

如果两个文件相同,则该部分的shell步骤显示 没有改变

cmp -s用在shell编程中

测试文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@localhost cmp]# ls
a.txt b.txt c.txt isSame.sh
[root@localhost cmp]# cat -n a.txt
1 this is line a
2 this is line b
3 helloworld!
4 this is line d
[root@localhost cmp]# cat -n b.txt
1 this is line a
2 this is line b
3 this is line c
4 this is line d
[root@localhost cmp]# cat -n c.txt
1 this is line a
2 this is line b
3 helloworld!
4 this is line d
[root@localhost cmp]#

shell程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost cmp]# cat isSame.sh 
if cmp -s a.txt b.txt
then
echo a.txt与b.txt相同
else
echo a.txt与b.txt不同
fi

if cmp -s a.txt c.txt
then
echo a.txt与c.txt相同
else
echo a.txt与c.txt不同
fi

[root@localhost cmp]#

运行结果:

1
2
3
4
[root@localhost cmp]# ./isSame.sh 
a.txt与b.txt不同
a.txt与c.txt相同
[root@localhost cmp]#

windows的comp命令示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
G:\Desktop\test\CMD>dir
驱动器 G 中的卷是 原来的C盘
卷的序列号是 0C02-061D

G:\Desktop\test\CMD 的目录

2021/05/15 22:50 <DIR> .
2021/05/15 22:50 <DIR> ..
2021/05/15 22:50 57 a.txt
2021/05/15 22:50 60 b.txt
2 个文件 117 字节
2 个目录 102,362,640,384 可用字节

G:\Desktop\test\CMD>comp a.txt b.txt
比较 a.txt 和 b.txt...
文件的大小不同。

是否要比较更多文件 (Y/N)? y
第一个比较文件的名称:b.txt
第二个比较文件的名称:a.txt
选项:
比较 b.txt 和 a.txt...
文件的大小不同。

是否要比较更多文件 (Y/N)? N

G:\Desktop\test\CMD>

cmp参考手册

tldr cmp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost cmp]# tldr cmp

cmp

Compare two files byte by byte.
More information: https://www.gnu.org/software/diffutils/manual/html_node/Invoking-cmp.html.

- Find the byte and line number of the first difference between two files:
cmp path/to/file1 path/to/file2

- Find the byte number and differing bytes of every difference:
cmp -l path/to/file1 path/to/file2

[root@localhost cmp]#

cmp –help

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
[root@localhost cmp]# cmp --help
用法: cmp [选项]... 文件1 [文件2 [SKIP1 [SKIP2]]]
逐字节比较两个文件。

The optional SKIP1 and SKIP2 specify the number of bytes to skip
at the beginning of each file (zero by default).

Mandatory arguments to long options are mandatory for short options too.
-b, --print-bytes print differing bytes
-i, --ignore-initial=SKIP skip first SKIP bytes of both inputs
-i, --ignore-initial=SKIP1:SKIP2 skip first SKIP1 bytes of FILE1 and
first SKIP2 bytes of FILE2
-l, --verbose output byte numbers and differing byte values
-n, --bytes=LIMIT compare at most LIMIT bytes
-s, --quiet, --silent suppress all normal output
--help display this help and exit
-v, --version output version information and exit

SKIP 值可以加上以下的单位:
kB=1000、K=1024、MB=1000000、M=1048576、GB=1000000000、G=1073741824,
还有 T、P、E、Z、Y 如此类推。

If a FILE is '-' or missing, read standard input.
如果输入相同,则退出状态为 0;1 表示输入不同;2 表示有错误产生。

Report bugs to: bug-diffutils@gnu.org
GNU diffutils home page: <http://www.gnu.org/software/diffutils/>
General help using GNU software: <http://www.gnu.org/gethelp/>
[root@localhost cmp]#

man cmp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
CMP(1)                                                                User Commands                                                               CMP(1)

NAME
cmp - compare two files byte by byte

SYNOPSIS
cmp [OPTION]... FILE1 [FILE2 [SKIP1 [SKIP2]]]

DESCRIPTION
Compare two files byte by byte.

The optional SKIP1 and SKIP2 specify the number of bytes to skip at the beginning of each file (zero by default).

Mandatory arguments to long options are mandatory for short options too.

-b, --print-bytes
print differing bytes

-i, --ignore-initial=SKIP
skip first SKIP bytes of both inputs

-i, --ignore-initial=SKIP1:SKIP2
skip first SKIP1 bytes of FILE1 and first SKIP2 bytes of FILE2

-l, --verbose
output byte numbers and differing byte values

-n, --bytes=LIMIT
compare at most LIMIT bytes

-s, --quiet, --silent
suppress all normal output

--help display this help and exit

-v, --version
output version information and exit

SKIP values may be followed by the following multiplicative suffixes: kB 1000, K 1024, MB 1,000,000, M 1,048,576, GB 1,000,000,000, G
1,073,741,824, and so on for T, P, E, Z, Y.

If a FILE is '-' or missing, read standard input. Exit status is 0 if inputs are the same, 1 if different, 2 if trouble.

AUTHOR
Written by Torbjorn Granlund and David MacKenzie.

REPORTING BUGS
Report bugs to: bug-diffutils@gnu.org
GNU diffutils home page: <http://www.gnu.org/software/diffutils/>
General help using GNU software: <http://www.gnu.org/gethelp/>

COPYRIGHT
Copyright © 2013 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.

SEE ALSO
diff(1), diff3(1), sdiff(1)

The full documentation for cmp is maintained as a Texinfo manual. If the info and cmp programs are properly installed at your site, the command

info cmp

should give you access to the complete manual.

diffutils 3.3 August 2019 CMP(1)

参考资料

http://www.linuxso.com/command/cmp.html
https://www.runoob.com/linux/linux-comm-cmp.html
https://man.linuxde.net/cmp

cheat介绍

https://github.com/cheat/cheat

cheat安装

cheat使用

cheat tar

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
[root@localhost sed]# cheat tar
# To extract an uncompressed archive:
tar -xvf /path/to/foo.tar

# To create an uncompressed archive:
tar -cvf /path/to/foo.tar /path/to/foo/

# To extract a .gz archive:
tar -xzvf /path/to/foo.tgz

# To create a .gz archive:
tar -czvf /path/to/foo.tgz /path/to/foo/

# To list the content of an .gz archive:
tar -ztvf /path/to/foo.tgz

# To extract a .bz2 archive:
tar -xjvf /path/to/foo.tgz

# To create a .bz2 archive:
tar -cjvf /path/to/foo.tgz /path/to/foo/

# To extract a .tar in specified Directory:
tar -xvf /path/to/foo.tar -C /path/to/destination/

# To list the content of an .bz2 archive:
tar -jtvf /path/to/foo.tgz

# To create a .gz archive and exclude all jpg,gif,... from the tgz
tar czvf /path/to/foo.tgz --exclude=\*.{jpg,gif,png,wmv,flv,tar.gz,zip} /path/to/foo/

# To use parallel (multi-threaded) implementation of compression algorithms:
tar -z ... -> tar -Ipigz ...
tar -j ... -> tar -Ipbzip2 ...
tar -J ... -> tar -Ipixz ...
[root@localhost sed]#

参考资料

https://zhuanlan.zhihu.com/p/32637435
https://linux.cn/article-9193-1.html
https://linux.cn/article-3760-1.html
https://segmentfault.com/a/1190000038323985

tldr命令介绍

该命令可以显示一些命令的常见用法
tldr全称Too long, Don’t read,翻译成中文就是[太长不读]。tldr根据二八原则将命令的常用场景给出示例,让人一看就懂。
tldr是简化版的使用手册,并不会像man一样把所有的使用参数和说明都列出来,而是只显示常用的几个使用Sample和说明。

相关网址

官网:https://tldr.sh/
在线查询网站:https://tldr.ostera.io/
在线查询网站源码:https://github.com/ostera/tldr.jsx
github:https://github.com/tldr-pages/tldr
安卓客户端:
https://play.google.com/store/apps/details?id=io.github.hidroh.tldroid
https://play.google.com/store/apps/details?id=wtf.technodisaster.tldr
电脑客户端:https://github.com/terenceng2010/tldr-electron

tldr安装

1
npm install -g tldr

tldr使用示例

tldr man

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
[root@localhost sed]# tldr man

man

Format and display manual pages.
More information: https://www.man7.org/linux/man-pages/man1/man.1.html.

- Display the man page for a command:
man command

- Display the man page for a command from section 7:
man command.7

- Display the path searched for manpages:
man --path

- Display the location of a manpage rather than the manpage itself:
man -w command

- Display the man page using a specific locale:
man command --locale=locale

- Search for manpages containing a search string:
man -k "search_string"


[root@localhost sed]#

tldr ls

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[root@localhost sed]# tldr ls

ls

List directory contents.
More information: https://www.gnu.org/software/coreutils/ls.

- List files one per line:
ls -1

- List all files, including hidden files:
ls -a

- List all files, with trailing / added to directory names:
ls -F

- Long format list (permissions, ownership, size, and modification date) of all files:
ls -la

- Long format list with size displayed using human readable units (KiB, MiB, GiB):
ls -lh

- Long format list sorted by size (descending):
ls -lS

- Long format list of all files, sorted by modification date (oldest first):
ls -ltr


[root@localhost sed]#

tldr tar

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
[root@localhost sed]# tldr tar

tar

Archiving utility.
Often combined with a compression method, such as gzip or bzip2.
More information: https://www.gnu.org/software/tar.

- [c]reate an archive and write it to a [f]ile:
tar cf target.tar file1 file2 file3

- [c]reate a g[z]ipped archive and write it to a [f]ile:
tar czf target.tar.gz file1 file2 file3

- [c]reate a g[z]ipped archive from a directory using relative paths:
tar czf target.tar.gz --directory=path/to/directory .

- E[x]tract a (compressed) archive [f]ile into the current directory [v]erbosely:
tar xvf source.tar[.gz|.bz2|.xz]

- E[x]tract a (compressed) archive [f]ile into the target directory:
tar xf source.tar[.gz|.bz2|.xz] --directory=directory

- [c]reate a compressed archive and write it to a [f]ile, using [a]rchive suffix to determine the compression program:
tar caf target.tar.xz file1 file2 file3

- Lis[t] the contents of a tar [f]ile [v]erbosely:
tar tvf source.tar

- E[x]tract files matching a pattern from an archive [f]ile:
tar xf source.tar --wildcards "*.html"

[root@localhost sed]#

参考资料

https://www.hi-linux.com/posts/16098.html
https://blog.csdn.net/xingchenxuanfeng/article/details/89398327

基本正则表达式 BRE元字符表

元字符 说明
* *前面的正则表达式匹配的结果重复任意次(含0次)。
\+ 与星号(*)相同,只是至少重复1次,GNU的扩展功能。
\? 与星号(*)相同,只是最多重复1次,GNU的扩展功能。
\{i\} 与星号(*)相同,只是重复指定的i次。
\{i,j\} 与星号(*)相同,只是重复i至j次。
\{i, \} 与星号(*)相同,只是至少重复i次。
\(regexp\) 将regexp看作一个整体,用于后向引用,与\digit配合使用。
. 匹配任意单个字符。
^ 匹配模版空间开始处的NULL字符串。
$ 匹配的是模版空间结束处的NULL字符串。
[list] 匹配方括号中的字符列表中的任意一个。
[^list] 否定匹配方括号中的字符列表中的任意一个。
regexp1&#124;regexp2 用在相邻的正则表达式之间,表示匹配这些正则表达式中任一个都可以。匹配是从左向右开始的,一旦匹配成功就停止匹配。
regexp1|regexp2 匹配regexp1和regexp2的连接结果。
\digit 匹配正则表达式前半部分定义的后向引用的第digit个子表达式。digit为1至9的数字, 1为从左开始。
\n 匹配换行符。
\meta 将元字符meta转换成普通字符,以便匹配该字符本身,有$*.[\^

扩展正则表达式

扩展正则表达式除了以下元字符与基本正则表达式不同外,其余相似。

BRE与ERE元字符对应表

基本正则表达式 扩展正则表达式
\? ?
\+ +
&#124; |
\{ \} { }
\( \) ( )

sed 多行命令

在学习 sed 命令的基础功能时,你可能注意到了一个局限,即所有的 sed 命令都只是针对单行数据执行操作,在 sed 命令读取缓冲区中的文本数据时,它会基于换行符的位置,将数据分成行,sed 会根据定义好的脚本命令一次处理一行数据。

但是,有时我们需要对跨多行的数据执行特定操作。比如说,在文本中查找一串字符串”http://c.biancheng.net",它很有可能出现在两行中,每行各包含其中一部分。这时,如果用普通的 sed 编辑器命令来处理文本,就不可能发现这种被分开的情况。

幸运的是,sed 命令的设计人员已经考虑到了这种情况,并设计了对应的解决方案。sed 包含了三个可用来处理多行文本的特殊命令,分别是:

  • Next 命令(N):将数据流中的下一行加进来创建一个多行组来处理。
  • Delete(D):删除多行组中的一行。
  • Print(P):打印多行组中的一行。

sed多行操作命令N

N 命令会将下一行文本内容添加到缓冲区已有数据之后(之间用换行符分隔),从而使前后两个文本行同时位于缓冲区中,sed 命令会将这两行数据当成一行来处理。

两行变一行

下面这个例子演示的 N 命令的功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost sed]# cat sed_append.txt 
this is line a
this is line b
this is line c
this is line d
hello
world
[root@localhost sed]# sed "/hello/{N;s/\n/ /}" sed_append.txt
this is line a
this is line b
this is line c
this is line d
hello world
[root@localhost sed]#

在这个例子中,sed 命令查找含有单词 hello 的那行文本。找到该行后,它会用 N 命令将下一行合并到那行,然后用替换命令 s 将换行符替换成空格。结果是,文本文件中的两行在 sed 的输出中成了一行。

示例2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@localhost exam]# cat result1.txt 
1单选(3分)
下列哪个不是单字符正则表达式?
A.
.
B.
[i-k]
C.
@
D.
$
正确答案:D你错选为C
[root@localhost exam]# sed -r 'N;s/([A-Z]\.)\n(.+)/\1 \2/g' result1.txt
1单选(3分)
下列哪个不是单字符正则表达式?
A. .
B. [i-k]
C. @
D. $
正确答案:D你错选为C
[root@localhost exam]#

sed多行删除命令D

sed 不仅提供了单行删除命令(d),也提供了多行删除命令 D,其作用是只删除缓冲区中的第一行,也就是说,D 命令将缓冲区中第一个换行符(包括换行符)之前的内容删除掉。

多行打印命令P

同 d 和 D 之间的区别一样,P(大写)命令和单行打印命令 p(小写)不同,对于具有多行数据的缓冲区来说,它只会打印缓冲区中的第一行,也就是首个换行符之前的所有内容。

未完待续

参考资料

http://c.biancheng.net/view/4056.html

Linux复杂筛选及加工命令awk

awk:逐行扫描进行文本处理的一门语言

a.w.k分别为该程序的三位设计者姓氏的第一个字母

用法

awk ‘程序’ 文件名列表
awk -f 程序文件名 文件名列表

awk程序

1
条件{动作}

awk自动对每行文本执行条件判断,满足条件则执行动作 (内置循环)
允许多段程序:多段程序间用空格或分号隔开。

处理方式

  • 输入文件的每行作为一个“记录”,awk内置变量NR就是行号
  • 每行用空格分隔开的部分,叫做记录的“域”
    • 内置变量$1是第1域内容,依次,$2是第2域内容,……
    • 特别的,$0指的是整个这一行的内容
  • awk的处理为:符合条件的行,执行相应的动作

awk描述条件的方法

关系运算 与C语言类似的

awk关系运算符 描述
< 小于
<= 小于或等于
== 等于
!= 不等于
> 大于
>= 大于或等于

逻辑运算符

使用与C语言类似的逻辑算符

awk逻辑运算符 描述
&#124;&#124; 条件或
&& 条件与
! 条件非

正则表达式的模式匹配 /regexpr/

包含该模式的行,执行动作

特殊的条件

  • 不指定任何条件:对所有文本行执行动作
  • BEGIN:开始处理所有文本行之前执行动作
  • END:处理完所有文本行之后执行动作

awk描述动作的方法

描述“动作”时,简单的用法有:

  • 自定义变量
  • 加减乘除等算术逻辑运算
  • 正则表达式匹配运算符(用作条件判断) ~ !~
    • 例如: $2 ~ “[1-9][0-9]*”
  • 流程控制(与C语言类似)
    • 条件判断 if
    • 循环控制 for
  • print 变量1, 变量2,……
  • printf(”格式串”,变量1,变量2,……)

awk示例

只显示命令输出的某些列

只显示ls -l命令的某些列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@localhost Linux_Test]# ls -l
总用量 48
-rw-r--r--. 1 root root 0 5月 3 15:27 a.txt
-rw-r--r--. 1 root root 0 5月 3 15:27 b.txt
drwxr-xr-x. 2 root root 4096 5月 1 15:16 cat
-rw-r--r--. 1 root root 0 5月 3 15:27 c.txt
drwxr-xr-x. 2 root root 4096 5月 1 15:18 date
-rw-r--r--. 1 root root 0 5月 3 15:27 d.txt
drwxr-xr-x. 2 root root 4096 5月 1 15:16 less
drwxr-xr-x. 2 root root 4096 5月 1 15:14 ls
drwxr-xr-x. 2 root root 4096 5月 1 15:15 more
drwxr-xr-x. 2 root root 4096 5月 1 15:18 ps
drwxr-xr-x. 2 root root 4096 5月 1 15:15 sort
drwxr-xr-x. 2 root root 4096 5月 1 15:14 tr
drwxr-xr-x. 2 root root 4096 5月 1 18:47 uniq
drwxr-xr-x. 2 root root 4096 5月 1 15:17 vi
drwxr-xr-x. 2 root root 4096 5月 1 15:17 wc
drwxr-xr-x. 4 root root 4096 5月 3 14:36 正则表达式
[root@localhost Linux_Test]#

只打印第1列和第9列(最后一列):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@localhost Linux_Test]# ls -l| awk '{ printf("%s %s\n",$1,$9); }'
总用量
-rw-r--r--. a.txt
-rw-r--r--. b.txt
drwxr-xr-x. cat
-rw-r--r--. c.txt
drwxr-xr-x. date
-rw-r--r--. d.txt
drwxr-xr-x. less
drwxr-xr-x. ls
drwxr-xr-x. more
drwxr-xr-x. ps
drwxr-xr-x. sort
drwxr-xr-x. tr
drwxr-xr-x. uniq
drwxr-xr-x. vi
drwxr-xr-x. wc
drwxr-xr-x. 正则表达式
[root@localhost Linux_Test]#

只显示date命令的某些列

1
2
3
4
5
6
7
8
9
[root@localhost C_Test]# date
2021年 05月 03日 星期一 16:30:54 CST
[root@localhost C_Test]# date|awk '{printf("%s %s %s\n",$1,$2,$3);}'
2021年 05月 03日
[root@localhost C_Test]# date|awk '{printf("%s\n",$4);}'
星期一
[root@localhost C_Test]# date|awk '{printf("%s\n",$5);}'
16:31:16
[root@localhost C_Test]#

上面这些功能也可以使用print实现:

1
2
3
4
5
6
7
8
9
[root@localhost C_Test]# date
2021年 05月 03日 星期一 16:41:03 CST
[root@localhost C_Test]# date|awk '{print $1 $2 $3}'
2021年05月03日
[root@localhost C_Test]# date|awk '{print $4}'
星期一
[root@localhost C_Test]# date|awk '{print $5}'
16:41:17
[root@localhost C_Test]#

显示文件时显示自定义行号

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@localhost C_Test]# cat helloworld.c
#include <stdio.h>

int main()
{
printf("%s\n","HelloWorld!");
}
[root@localhost C_Test]# cat helloworld.c|awk '{printf("%d: %s\n",NR,$0);}'
1: #include <stdio.h>
2:
3: int main()
4: {
5: printf("%s\n","HelloWorld!");
6: }
[root@localhost C_Test]# cat -n helloworld.c
1 #include <stdio.h>
2
3 int main()
4 {
5 printf("%s\n","HelloWorld!");
6 }
[root@localhost C_Test]#

只显示文件大小大于等于16KB的文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost C_Test]# ls -sh
总用量 120K
16K a.out 4.0K file1.txt 4.0K file3.txt 4.0K forkTest.c 4.0K helloworld.c 4.0K redCharacter.c 4.0K strerror.c 16K terminalColor.out
4.0K command.sh 4.0K file2.txt 4.0K file4.txt 16K forkTest.o 16K helloworld.out 16K redCharacter.out 4.0K terminalColor.c
[root@localhost C_Test]# ls -s
总用量 120
16 a.out 4 file1.txt 4 file3.txt 4 forkTest.c 4 helloworld.c 4 redCharacter.c 4 strerror.c 16 terminalColor.out
4 command.sh 4 file2.txt 4 file4.txt 16 forkTest.o 16 helloworld.out 16 redCharacter.out 4 terminalColor.c
[root@localhost C_Test]# ls -s|awk '$1>=16{printf("%s\n",$0);}'
总用量 120
16 a.out
16 forkTest.o
16 helloworld.out
16 redCharacter.out
16 terminalColor.out
[root@localhost C_Test]#

列出当前目录下的所有.c文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@localhost C_Test]# ls
a.out file1.txt file3.txt forkTest.c helloworld.c redCharacter.c strerror.c terminalColor.out
command.sh file2.txt file4.txt forkTest.o helloworld.out redCharacter.out terminalColor.c
[root@localhost C_Test]# ls|awk '/.+\.c/'
forkTest.c
helloworld.c
redCharacter.c
strerror.c
terminalColor.c
[root@localhost C_Test]# ls -l |awk '/.+\.c/'
-rw-r--r--. 1 root root 152 4月 11 17:26 forkTest.c
-rw-r--r--. 1 root root 66 5月 3 16:22 helloworld.c
-rw-r--r--. 1 root root 785 4月 3 22:34 redCharacter.c
-rw-r--r--. 1 root root 496 3月 24 17:53 strerror.c
-rw-r--r--. 1 root root 1623 4月 3 22:48 terminalColor.c
[root@localhost C_Test]#