AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 68684
In Process
C. Ross
C. Ross
Asked: 2009-09-26 04:47:47 +0800 CST2009-09-26 04:47:47 +0800 CST 2009-09-26 04:47:47 +0800 CST

如何让 diff 仅显示添加和删除的行?如果 diff 做不到,什么工具可以?

  • 772

如何让 diff 仅显示添加和删除的行?如果 diff 做不到,什么工具可以?

command-line-interface
  • 10 10 个回答
  • 98588 Views

10 个回答

  • Voted
  1. TomOnTime
    2009-09-26T10:11:39+08:002009-09-26T10:11:39+08:00

    试试通讯

    另一种看待它的方式:

    • 显示仅存在于文件 a 中的行:(即从 a 中删除的内容)

        comm -23 a b
      
    • 显示仅存在于文件 b 中的行:(即添加到 b 中的内容)

        comm -13 a b
      
    • 显示仅存在于一个文件或另一个文件中的行:(但不能同时存在)

        comm -3 a b | sed 's/^\t//'
      

    (警告:如果文件a有以 TAB 开头的行,它(第一个 TAB)将从输出中删除。)

    仅排序文件

    注意:这两个文件都需要进行排序comm才能正常工作。如果它们尚未排序,您应该对它们进行排序:

    sort <a >a.sorted
    sort <b >b.sorted
    comm -12 a.sorted b.sorted
    

    如果文件非常长,这可能是一个相当大的负担,因为它需要额外的副本,因此需要两倍的磁盘空间。

    • 115
  2. iphonedroid
    2016-01-05T22:41:45+08:002016-01-05T22:41:45+08:00

    显示没有上下文的添加和删除,行号,+,-,<,>!等等,你可以像这样使用差异:

    diff --changed-group-format='%<%>' --unchanged-group-format='' a.txt b.txt 
    

    例如,给定两个文件:

    一个.txt

    Common
    Common
    A-ONLY
    Common
    

    b.txt

    Common
    B-ONLY
    Common
    Common
    

    以下命令将显示从 a 中删除或添加到 b 的行:

    diff --changed-group-format='%<%>' --unchanged-group-format='' a.txt b.txt 
    

    输出:

    B-ONLY
    A-ONLY
    

    这个稍有不同的命令将显示从 a.txt 中删除的行:

    diff --changed-group-format='%<' --unchanged-group-format='' a.txt b.txt 
    

    输出:

    A-ONLY
    

    最后,此命令将显示添加到 a.txt 的行

    diff --changed-group-format='%>' --unchanged-group-format='' a.txt b.txt 
    

    输出

    B-ONLY
    
    • 22
  3. markdrayton
    2009-09-26T06:27:00+08:002009-09-26T06:27:00+08:00

    comm可能会做你想做的事。从它的手册页:

    描述

    逐行比较已排序的文件 FILE1 和 FILE2。

    在没有选项的情况下,生成三列输出。第一列包含 FILE1 唯一的行,第二列包含 FILE2 唯一的行,第三列包含两个文件共有的行。

    这些列可以分别用-1和-2来抑制-3。

    例子:

    [root@dev ~]# cat a
    common
    shared
    unique
    
    [root@dev ~]# cat b
    common
    individual
    shared
    
    [root@dev ~]# comm -3 a b
        individual
    unique
    

    如果您只想要独特的行而不关心它们在哪个文件中:

    [root@dev ~]# comm -3 a b | sed 's/^\t//'
    individual
    unique
    

    正如手册页所说,必须事先对文件进行排序。

    • 16
  4. Seppo Enarvi
    2013-10-18T06:34:09+08:002013-10-18T06:34:09+08:00

    视觉比较工具将两个文件组合在一起,因此具有相同行数但内容不同的段将被视为已更改的段。匹配段之间的全新行被视为添加的段。

    这也是sdiff命令行工具的工作方式,它显示了终端中两个文件的并排比较。更改的行由 | 分隔 特点。如果一行仅存在于文件 A 中,则使用 < 作为分隔符。如果一行只存在于文件 B 中,则 > 用作分隔符。如果文件中没有 < 和 > 字符,则可以使用它来仅显示添加的行:

    sdiff A B | grep '[<>]'
    
    • 4
  5. Dennis Williamson
    2009-09-26T07:59:27+08:002009-09-26T07:59:27+08:00

    不,diff实际上并没有以人们可能认为的方式显示两个文件之间的差异。patch它为喜欢用来将一个文件更改为另一个文件的工具生成一系列编辑命令。

    任何尝试做您正在寻找的事情的困难在于如何定义什么构成了已更改的行与删除的行和添加的行。还有当添加、删除和更改相邻的行时该怎么办。

    • 3
  6. Scott Lundberg
    2009-09-26T05:26:31+08:002009-09-26T05:26:31+08:00

    这就是 diff 默认所做的......也许你需要添加一些标志来忽略空格?

    diff -b -B
    

    应该忽略空行和不同数量的空格。

    • 2
  7. geniosity
    2013-11-19T04:05:28+08:002013-11-19T04:05:28+08:00

    谢谢 senarvi,您的解决方案(未投票)实际上给了我在大量页面上寻找年龄后我想要的东西。

    使用您的答案,这是我想出的获取更改/添加/删除的内容列表的方法。该示例使用 2 个版本的 /etc/passwd 文件并打印出相关记录的用户名。

    #!/bin/bash
    sdiff passwd1 passwd2 | grep '[|]' | awk -F: '{print "changed: " $1}'
    sdiff passwd1 passwd2 | grep '[<]' | awk -F: '{print "deleted: " $1}'
    sdiff passwd1 passwd2 | grep '[>]' | awk -F\> '{print $2}' | awk -F: '{print "added: " $1}'
    
    • 2
  8. Ciro Santilli OurBigBook.com
    2019-06-18T05:48:33+08:002019-06-18T05:48:33+08:00

    我发现这种特殊形式通常很有用:

    diff --changed-group-format='-%<+%>' --unchanged-group-format='' f g
    

    例子:

    printf 'a\nb\nc\nd\ne\nf\ng\n' > f
    printf 'a\nB\nC\nd\nE\nF\ng\n' > g
    diff --old-line-format=$'-%l\n' \
         --new-line-format=$'+%l\n' \
         --unchanged-line-format='' \
         f g
    

    输出:

    -b
    -c
    +B
    +C
    -e
    -f
    +E
    +F
    

    因此,它显示旧行,-紧跟其后的是相应的新行+。

    如果我们删除了C:

    printf 'a\nb\nd\ne\nf\ng\n' > f
    printf 'a\nB\nC\nd\nE\nF\ng\n' > g
    diff --old-line-format=$'-%l\n' \
         --new-line-format=$'+%l\n' \
         --unchanged-line-format='' \
         f g
    

    它看起来像这样:

    -b
    +B
    +C
    -e
    -f
    +E
    +F
    

    格式记录在man diff:

           --line-format=LFMT
                  format all input lines with LFMT`
    

    和:

           LTYPE is 'old', 'new', or 'unchanged'.
                  GTYPE is LTYPE or 'changed'.
    
    

    和:

                  LFMT (only) may contain:
    
           %L     contents of line
    
           %l     contents of line, excluding any trailing newline
    
           [...]
    

    相关问题:https ://stackoverflow.com/questions/15384818/how-to-get-the-difference-only-additions-between-two-files-in-linux

    在 Ubuntu 18.04 中测试。

    • 1
  9. Jabir Ali
    2022-03-26T05:15:46+08:002022-03-26T05:15:46+08:00

    我们可以结合 diff 和 sed 来实现你想要的。让我们以 https://serverfault.com/a/68717/947477中的相同示例为例

    [root@dev ~]# cat file1
    common
    shared
    unique
    
    [root@dev ~]# cat file2
    common
    individual
    shared 
    

    要显示添加的行+和删除的行,-我们可以使用

    root@dev ~]# diff -u file1 file2 |sed -n '/^\(+\|-\)/p'
    
    --- a   2022-03-25 18:30:57.507551352 +0530
    +++ b   2022-03-25 18:31:15.087860053 +0530
    -shared
    -unique
    +individual
    

    在这里,-u用于打印统一的内容,并且sed将仅过滤带有-或+开头的输出。

    一个更直接的答案是

    diff file1 file2
    < shared
    < unique
    ---
    > individual
    
    • 0
  10. Adriano
    2016-10-18T10:42:39+08:002016-10-18T10:42:39+08:00

    文件1:

    text670_1
    text067_1
    text067_2
    

    文件2:

    text04_1
    text04_2
    text05_1
    text05_2
    text067_1
    text067_2
    text1000_1
    

    利用:

    diff -y file1 file2
    

    这显示了relectives 文件的两列。

    输出:

    text670_1                           
                                      > text04_1
                                      > text04_2
                                      > text05_1
                                      > text05_2
    text067_1                           text67_1
    text067_2                           text67_2
                                      > text1000_1
    
    • -1

相关问题

  • 不会将整个 XML 文件读入内存的命令行 XML 验证器?

  • 在命令行上从 csv 文件中过滤带有空格字符的字段

  • 如何通过 SVN 命令行接受 SSL 证书?

  • 如何在 Linux 中删除名称中带有选项字符的文件?

  • 使用命令行工具按排序顺序计算重复项

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    Windows 中执行反向 DNS 查找的命令行实用程序是什么?

    • 14 个回答
  • Marko Smith

    如何检查 Windows 机器上的端口是否被阻塞?

    • 4 个回答
  • Marko Smith

    我应该打开哪个端口以允许远程桌面?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    kch 如何更改我的私钥密码? 2009-08-06 21:37:57 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve