【问题标题】:parsing strings using either grep,awk or sed使用 grep、awk 或 sed 解析字符串
【发布时间】:2016-08-31 04:22:10
【问题描述】:

我有一个文件,如下所示

17:59:49.987 - JobID 864563: Found 7 clips from SeqID 862753
17:59:49.987 - Processing Job 864562
17:59:50.003 - JobID 864561: Location 14695 applied clip data successfully. Updating OCAMT_GM_Sent
17:59:50.003 - Processing Job 864563
17:59:50.003 - JobID 864564
17:59:50.018 - JobID 864565
17:59:50.034 - Processing Job 864565
17:59:50.034 - JobID 864566
17:59:50.034 - JobID 864562
17:59:50.034 - JobID 864563
17:59:50.034 - Processing Job 864566
17:59:50.049 - JobID 864567
17:59:50.049 - JobID 864564
17:59:50.049 - Trying to send JobID 864566 to location 14623 at http://172.28.48.11/yb/ClipData.php. Retry count 0
17:59:50.049 - Processing Job 864567

我想捕获某些字符串,使其输出文件如下所示;

864563 17:59:49.987
864562 17:59:49.987
864561 17:59:50.003
864563 17:59:50.003

由于作业 id 长度是可变的,我正在考虑使用正则表达式 \d+ 并使用单词 Job 作为字段分隔符将行分成两半,但我不确定是否可以组合以下内容;

awk -F'Job*' '{print $1}'|awk '{print $1}'
awk -F'Job*' '{print $2}'

【问题讨论】:

  • edit 您的问题,因此显示的预期输出是您从显示的示例输入中获得的输出,而不是来自某些不同输入集的输出。我们需要一些可以测试潜在解决方案的东西,看看它是否产生预期的输出。
  • @Ed 我认为我提到的示例输出文件具有可以从输入中删除的值。我在忽略输入文件中的其他字符串时遇到问题
  • @Dren,您希望输出的依据是什么。Job 和 JobID 或仅其中一个。输入的每一行都包含该关键字吗?
  • @Dren 我不知道该评论是什么意思,但请查看您提供的输入和输出文件。输出文件中的任何值都不会出现在输入文件中。我们是否应该编写一个仅组成数字并打印它们的脚本?您发布的预期输出准确地是您应该从您发布的输入中获得的输出,这一点非常重要,否则该示例在阐明您的要求方面几乎没有用处,而且我们没有什么可以测试潜在的解决方案,因为我们不知道在发布的输入上运行时输出的内容是否是您想要的。
  • @Dren 没问题,我们快到了。 edit 现在再次解释您如何选择要打印的时间戳或作业 ID,因为它们不会全部出现在您的预期输出中。

标签: linux bash shell awk sed


【解决方案1】:

sed 版本:

sed -e 's/\([^ ]*\).*Job\(ID\)\? \([0-9]\+\).*/\3 \1/g'

或@spasic 指出的扩展正则表达式:

sed -E 's/^(\S+).*Job(ID)? ([0-9]+).*/\3 \1/'

【讨论】:

  • JobJobID 也可以指定为 Job\(\|ID\) .. 使用扩展正则表达式 sed -E 's/^(\S+).*Job(|ID) ([0-9]+).*/\3 \1/'
  • JobJobID 写成 Job(ID)?Job(|ID),您所拥有的是 POSIX standard 未定义的行为(“垂直线出现首先或最后出现在 ERE 中,或立即跟随垂直-行或左括号,或紧接在右括号之前,产生未定义的结果。)。
  • @EdMorton,谢谢,不知道。Job(ID)? 也更干净
  • @Dawid,您能否将答案更新为Job(ID)? 而不是Job(|ID)
  • @spasic 我昨天已经这样做了。也不知道。
【解决方案2】:

从你的 cmets 来看,我认为你期待这样的事情

使用awk

awk -F'[ ]+-.*Job(ID)? |:[ ]+|[ ]+' '{print $2, $1}' file

输出:

864563 17:59:49.987
864562 17:59:49.987
864561 17:59:50.003
864563 17:59:50.003
864564 17:59:50.003
864565 17:59:50.018
864565 17:59:50.034
864566 17:59:50.034
864562 17:59:50.034
864563 17:59:50.034
864566 17:59:50.034
864567 17:59:50.049
864564 17:59:50.049
864566 17:59:50.049
864567 17:59:50.049

【讨论】:

  • IMO Job[ID]* 应更改为 Job(ID)?
猜你喜欢
  • 2011-07-19
  • 2021-12-28
  • 1970-01-01
  • 2019-10-20
  • 2017-09-08
  • 2019-01-08
  • 2011-12-27
  • 2019-09-16
  • 1970-01-01
相关资源
最近更新 更多