【问题标题】:List folder contents and only show unique value [closed]列出文件夹内容并仅显示唯一值[关闭]
【发布时间】:2021-02-02 12:47:51
【问题描述】:

有没有办法使用“ls”命令,然后通过管道输出只显示唯一的项目?

示例如下:

ls /dev/disk/by-id


ata-ST500DM002-1BD142_S2AFE0JP
ata-ST500DM002-1BD142_W2AEDMQK
ata-ST500DM002-1BD142_W2AEDMQK-part1
ata-ST500DM002-1BD142_W2AEDMQK-part2
ata-ST500DM002-1BD142_W2AEDMQK-part3
ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2EEV65804
ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2EEV65804-part1
ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2EEV65804-part9
ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2EKK60289
ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2EKK60289-part1
ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2EKK60289-part9
ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2ET092491
ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2ET092491-part1
ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2ET092491-part9
ata-WDC_WD5003AZEX-00MK2A0_WD-WCC3F2HAD1XC
ata-WDC_WD5003AZEX-00MK2A0_WD-WCC3F2HAD1XC-part1
ata-WDC_WD5003AZEX-00MK2A0_WD-WCC3F2HAD1XC-part9

正如您在输出中看到的,除了其中一个项目外,所有项目都有序列号和 -part#,但序列号位于顶部:

'ata-ST500DM002-1BD142_S2AFE0JP'

没有。我想要做的是让输出只显示没有任何其他重复序列条目的重新测试。输出将只是唯一的序列号。

ata-ST500DM002-1BD142_S2AFE0JP

谢谢。

【问题讨论】:

  • 预期输出,请包括您的尝试
  • 我添加了预期的输出
  • 这能回答你的问题吗? How to print only the unique lines in BASH?
  • 顺便说一句:为什么这与您的参数不匹配? ata-ST500DM002-1BD142_W2AEDMQK
  • 您可以使用像files=( /dev/disk/by-id/* ) 这样的glob 来收集数组中的名称。您可以使用参数扩展来修改数组的内容,例如serials=( "${files[@]#ata-}" ) serials=( "${files[@]%-part*}" )。您可以使用printf '%s\n' "${serials[@]}" 输出这样的数组。您可以使用sort -u 使列表独一无二。

标签: bash awk sed terminal grep


【解决方案1】:

将 grep 与正则表达式一起使用:ls | grep -Ev 'part.*$'

$ ls test
ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2EEV65804        ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2EEV65804-part9  ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2ET092491-part1
ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2EEV65804-part1  ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2ET092491        ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2ET092491-part9
$ ls test | grep -Ev 'part.*$'
ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2EEV65804
ata-WDC_WD5000AAKX-60U6AA0_WD-WCC2ET092491

【讨论】:

  • 得到这个错误:grep: invalid option -- 'p'
  • 我修正了答案,因为“-”被认为是一个选项。
  • 不工作,我仍然得到序列号,(序列号)--part#
  • 不要忘记 * 前面的点。我刚刚修好了。
【解决方案2】:

假设这些条目不包含换行符,您可以使用:

printf '%s\n' /dev/disk/by-id/* |
awk '!/-part[0-9]*$/{arr[$0]; next} { sub(/-[^-]+$/, ""); delete arr[$0] } 
END { for (i in arr) print i }'
ata-ST500DM002-1BD142_S2AFE0JP

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 2012-03-09
    • 2020-12-25
    • 2011-02-15
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多