【问题标题】:How to extract particular string from a file (linux)如何从文件中提取特定字符串(linux)
【发布时间】:2016-12-12 01:41:07
【问题描述】:

我有以下文件

vol-12345678    gp2
vol-89dfg58g
VOLUMES 2016-03-17T22:03:08.374Z  False   100     16      snap-7073d522   in-use  vol-4568gds4    gp2
ATTACHMENTS     2016-03-17T22:03:08.000Z        True    /dev/sda1       i-181ed33c      attached        vol-7ea1c83f

等等

等等

我想提取 'vol-********' 的所有实例并将其输出到一个文件(不包括其他内容),从而生成一个文件:

vol-12345678

vol-34556767

vol-34534sdf

...

这是一个相对较小的文件,所以我可以手动完成,但我还有一个包含 200 多个案例的文件。知道如何使用 GREP 或 SED 或 AWK 来使用它吗?谢谢!

【问题讨论】:

  • 示例输出中的数字似乎与输入数据不匹配。
  • 只是举例说明
  • 输出示例应该始终匹配数据。
  • 这很好,但要确保你留下的输入和输出是一致的。当您的输入是 A B C 时,不要告诉我们您要输出 X。这很重要。

标签: linux parsing command-line sed grep


【解决方案1】:

应该这样做:

grep -o 'vol-[[:alnum:]]*' input.data | sort -u > output.data

【讨论】:

  • 嗯。这个问题没有提到重复......但我现在添加了一个sort -u
  • 太棒了!谢谢-我也试过'| uniq' 并且效果也很好。
  • @Dallas 通往 uniq 的管道是巧合。阅读您正在使用的工具的手册页。
【解决方案2】:

更新 命令:

sed -n 's/.*\b\(vol-[[:alnum:]]*\).*/\1/'p test2

输出:

vol-12345678
vol-89dfg58g
vol-4568gds4
vol-7ea1c83f

标志: n : 禁止自动打印图案空间。 p : 打印出模式空间

图案:

  • 寻找'vol-[alphanumeric]s'
  • 替换它并使用 \1 打印第一个匹配项

更多详情Sed

【讨论】:

  • 你能解释一下sed之后所有的标志是什么吗?这工作得很好,但我不明白它是如何工作的
  • @Dallas 这不符合您的要求(在您的输入中尝试使用“garden voles sink”之类的行),甚至不会产生您的问题中显示的预期输出,所以为什么你会接受吗?
  • 它不应该工作,但考虑到 OP 初稿中的输入数据,上面的代码确实有效,因为尽管有重复的 'vol-' 数字,但只有 一个每个 'vol-' 数字后跟一个 空格,其他数字后跟 '\n'。至少,这是一个有趣的巧合。
  • 同意这不是一个完整的解决方案。更新的命令现在就可以了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多