0
点赞
收藏
分享

微信扫一扫

Linux命令--操作文件内容--diff/patch/awk--使用/示例

zibianqu 2022-02-25 阅读 93


简介

        本文介绍Linux操作文件内容的一些命令,包括如下:

diff:比较文件或者文件夹(可以生成补丁文件,用patch去打补丁)

patch:给文件打补丁

awk:分析处理文本内容

diff

作用​:比较文件或者文件夹

格式​:diff [参数] [文件1或目录1] [文件2或目录2]

参数​:

  --normal                                      以正常的 diff 方式输出 (默认)

  -q, --brief                                    只有在文件不同时报告

  -s, --report-identical-files          当两个一样时仍然显示结果

  -c, -C NUM, --context[=NUM]   拷贝的文本的输出行数(默认为3)。输出结果:“+” :比较的文件的后者比前者多一行;

                                                     “-”: 比较的文件的后者比前着少一行:“!” 比较的文件两者有差别的行

  ​-u​, -U NUM, --unified[=NUM]    在比较结果中输出上下文中一些相同的行位。NUM可以不写,默认为3。

  -e, --ed                                        以 ed script 方式输出

  -n, --rcs                                       以 RCS diff 格式输出

  -y, --side-by-side                        两列输出。输出结果:“|”表示前后2个文件内容有不同;“<”表示后面文件比前面文件少了1行

                                                       内容;“>”表示后面文件比前面文件多了1行内容

  -W, --width=数量                        每行显示最多 <数量>(默认 130)个字符

  --left-column                               当有两行相同时只显示左边栏的一行

  --suppress-common-lines        当有两行相同时不显示

  -p, --show-c-function                 显示每个改变在哪个C函数中

  -F, --show-function-line=RE      显示匹配RE的最近的行

  --label LABEL                           使用LABEL来替换文件名和时间戳

  -t, --expand-tabs                       将输出中的 tab 转换成空格

  -T, --initial-tab                            每行先加上 tab 字符,使 tab 字符可以对齐

  --tabsize=数字                           TAB 格的宽度,默认为 8 个打印列宽

  --suppress-blank-empty           在空的输出行之前废除空格或者tab

  -l, --paginate                              将输出送至 “pr” 指令来分页

 ​ -r, --recursive ​                             连同所有子目录一起比较

  --no-dereference                       不要加上符号链接

 ​ -N, --new-file ​                              不存在的文件以空文件方式处理

  --unidirectional-new-file             若第一文件不存在,以空文件处理

  --ignore-file-name-case            忽略文件名大小写的区别

  --no-ignore-file-name-case      不忽略文件名大小写的区别

  -x, --exclude=模式                      排除匹配 <模式> 的文件

  -X, --exclude-from=文件            排除所有匹配在<文件>中列出的模式的文件

  -S, --starting-file=文件               当比较目录時,由<文件>开始比较

  --from-file=文件1                        将<文件1>和操作数中的所有文件/目录作比较;<文件1>可以是目录

  --to-file=文件2                            将操作数中的所有文件/目录和<文件2>作比较;<文件2>可以是目录

  -i, --ignore-case                         忽略文件内容大小写的区别

  -E, --ignore-tab-expansion       忽略由制表符宽度造成的差异

  -Z, --ignore-trailing-space         忽略每行末端的空格

  -b, --ignore-space-change        忽略由空格数不同造成的差异

 ​ -w, --ignore-all-space​                忽略对空格的比较

  ​-B, --ignore-blank-lines​              忽略任何因空行而造成的差异

  -I, --ignore-matching-lines=正则    若某行完全匹配 <正则>,则忽略由该行造成的差异

  -a, --text                                            所有文件都以文本方式处理

  --strip-trailing-cr                               去除输入内容每行末端的回车(CR)字符

  -D, --ifdef=名称                                输出的内容以 ‘#ifdef <名称>’ 方式标明差异

  --GTYPE-group-format=GFMT       以 GFMT 格式处理 GTYPE 输入行组

  --line-format=LFMT                          以 LFMT 格式处理每一行资料

  --LTYPE-line-format=LFMT             以 LFMT 格式处理 LTYPE 输入的行

    这些格式选项提供了对diff的输出详细的控制These format options provide fine-grained control over the output

      LTYPE 可以是 “old”、“new” 或 “unchanged”。GTYPE 可以是 LTYPE 的选择

    或是 “changed”。

  (仅)GFMT 可包括:

      %<  该组中每行属于<文件1>的差异

      %>  该组中每行属于<文件2>的差异

      %=  该组中同时在<文件1>和<文件2>出现的每一行

      %[-][宽度][.[精确度]]{doxX}字符  以 printf 格式表示该<字符>代表的内容

        大写<字符>表示属于新的文件,小写表示属于旧的文件。<字符>的意义如下:

          F  行组中第一行的行号

          L  行组中最后一行的行号

          N  行数 ( =L-F+1 )

          E  F-1

          M  L+1

      %(A=B?T:E)  如果 A 等于 B 那么 T 否则 E

  (仅)LFMT 可包括:

      %L  该行的内容

      %l  该行的内容,但不包括结束的换行符

      %[-][宽度][.[精确度]]{doxX}n  以 printf 格式表示的输入行号

    GFMT 或 LFMT 都可包括:

      %%        %

      %c'C'     单个字符 C

      %c'\OOO'  八进制码 OOO 所代表的字符

      C         字符 C(处上述转义外的其他字符代表它们自身)

  -d, --minimal                        尽可能找出最小的差异。

  --horizon-lines=数量           保持<数量>行的一致前后缀

  --speed-large-files              假设文件十分大而且文件中含有许多微小的差异

  --color[=WHEN]                  色彩化输出,可以是never,always,auto(默认)

  --palette=PALETTE            当--color激活时,使用的颜色。

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

  -v, --version                          输出版本信息并退出

示例

1.比较两个文件

命令:diff log2014.log log2013.log

输出:

3c3

< 2014-03

---

> 2013-03

8c8

< 2013-07

---

> 2013-08

11,12d10

< 2013-11

< 2013-12

讲解​:

“3c3”和“8c8”表示log2014.log和log20143log文件在3行和第8行内容有所不同;"11,12d10"表示第一个文件比第二个文件多了第11和12行。

diff 的normal 显示格式有三种提示:

a - add

c - change

d - delete 

2:输出举例​:

--- log2014.log 2012-12-07 18:01:54.000000000 +0800

+++ log2013.log 2012-12-07 16:36:26.000000000 +0800

@@ -1,12 +1,10 @@

说明:

"---"表示变动前的文件,"+++"表示变动后的文件。

变动的位置用两个@作为起首和结束。

      @@ -1,12 +1,10 @@

前面的"-1,12"分成三个部分:减号表示第一个文件(即log2014.log),"1"表示第1行,"12"表示连续12行。合在一起,就表示下面是第一个文件从第1行开始的连续12行。同样的,"+1,10"表示变动后,成为第二个文件从第1行开始的连续10行。

3:diff产生可以patch的文件

例如:假设linux-2.6.22.6目录中是原始的内核,linux-2.6.22.6_ok目录中是修改过的内核,可以使用以下命令

制作补丁文件linux-2.6.22.6_ok.diff(原始目录在前,修改过的目录在后)。

$diff-urNB linux-2.6.22.6 linux-2.6.22.6_ok > linux-2.6.22.6_ok.diff

patch

假设linux-2.6.22.6_ok.diff和linux-2.6.22.6 位于同一个目录下。

$ cd linux-2.6.22.6

$ patch -p1 < ../ linux-2.6.22.6_ok.diff

patch命令中最重要的选项是“-pn”:补丁文件中指明了要修改的文件的路径,“-pn”表 

示忽略路径中第n个斜线之前的目录。假设 nniix-2.6.22.6_ok.d iff中有如下几行:

diff -urNwB linux-2.6 .22.6/A/B/C.h linux-2.6.22.6_ok/A/B/C.h 

--- linux-2.6.22.6/A/B/C.h 2007-08-31 02:21:01.000000000 -0400 

+++ linux-2.6.22.6_ok/A/B/C.h 2007-09-20 18:11:46.000000000 -0400

......

使用上述命令打补丁吋,patch命令根据 “linux-2.6.22.6/A/B/C.h” 寻找源文件, -p1”

表示忽略第1个斜线之前的目录,所以要修改的源文件足当前目录下的:A/B/C.h。

打多个补丁的方法:

例:将../debian/patches/下的所有补丁打到本路径下:

  for file in ../debian/patches/*.patch; do patch -p1 < $file; done   

(上边一行也是一个命令,直接复制粘贴运行即可。此命令可以用于多个文件的操作)

awk

简介

        AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。

        之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 Family Name 的首字符。

示例


命令



作用



基础



awk '{print $4,$6}' f.txt



打印f.txt第4,第6个字符串。awk是从1开始计数的,而不是0



awk '{print NR,$0}' f.txt cpf.txt






awk '{print FNR,$0}' f.txt cpf.txt






awk '{print FNR,FILENAME,$0}' f.txt cpf.txt






awk '{print FILENAME,"NR="NR,"FNR="FNR,"$"NF"="$NF}' f.txt cpf.txt






echo 1:2:3:4 | awk -F: '{print $1,$2,$3,$4}'






匹配



awk '/ldb/ {print}' f.txt



匹配ldb          



awk '!/ldb/ {print}' f.txt



不匹配ldb        



awk '/ldb/ && /LISTEN/ {print}' f.txt



匹配ldb和LISTEN



awk '$5 ~ /ldb/ {print}' f.txt



第五列匹配ldb     


说明


变量



含义



ARGC



当前命令行参数个数



ARGIND



当前文件在ARGV中的位置



ARGV



包含命令行参数的数组



CONVFMT



数字的转换格式(参见printf语句),默认值为%.6



ENVIRON



当前shell环境变量及其值组成的关联数组



ERRNO



当读取或关闭输入文件发生错误时的系统错误号



FILENAME



用作awk输入数据的数据文件的文件名



FNR



当前数据文件中的数据行数。

在awk处理多个输入文件的时候,在处理完第一个文件后,NR并不会从1开始,而是继续累加,因此就出现了FNR,每当处理一个新文件的时候,FNR就从1开始计数,FNR可以理解为File Number of Record。



IGNORECASE



设成非零值时,忽略gawk命令中出现的字符串的字符大小写



NF



数据文件中的字段总数。

表示目前的记录被分割的字段的数目,NF可以理解为Number of Field。



NR



已处理的输入记录数。

表示从awk开始执行后,按照记录分隔符读取的数据次数,默认的记录分隔符为换行符,因此​默认的就是读取的数据行数​,NR可以理解为Number of Record的缩写。



OFMT



数字的输出格式,默认值为%.6



RLENGTH



由match函数所匹配的子字符串的长度



RSTART



由match函数所匹配的子字符串的起始位置



举报

相关推荐

0 条评论