【问题标题】:How to use grep or awk to get particular numbers from a file and put them in a text file?如何使用 grep 或 awk 从文件中获取特定数字并将它们放入文本文件中?
【发布时间】:2021-05-25 08:26:45
【问题描述】:

我有以下文件“file.log”:

ABC : 1
XYZ : 10
MMM : 3

ABC : 4
XYZ : 22
MMM : 5

ABC : 22
XYZ : 1
MMM : 3

... and so on

我正在尝试编写一个 bash 脚本,该脚本将使用 ABC 和 MMM 检查每一行(不需要 XYZ)并且只获取整数(例如 1、4 和 22 用于 ABC,3,5 和 3 用于MMM) 并将它们全部放在一个 txt 文件中,例如 solution.txt。

我正在使用以下命令:

cat file.log | grep "ABC" | grep -o '[0-9]\+' > solution.txt

但这只会按顺序打印出 ABC 的整数,即

1
4
22

但是我希望它们是 ABC,然后是 MMM,因为它出现在“file.log”中

想要的输出:

1
3
4
5
22
3

我是否需要将 grep 放入一个循环中以仅一行一行地执行,或者如果它可以与“awk”结合使用,问题就可以解决?

谢谢。

【问题讨论】:

  • 我会用 grep 过滤它们,然后使用 cut 来取出数字。当然你可以使用awk直接得到你想要的,但是语法超出我的想象
  • @BingWang 你能否举个例子,当我尝试使用 grep 过滤时,ABC 和 MMM 的整数不在我想要的序列中。所有的 ABC 都在一起,MMM 也是如此。
  • grep -E "^ABC|^XYZ" file.log 稍微净化了结果。最现代的 (GNU) grep 应该可以工作
  • 最后一位应该是 3。
  • @BingWang awk 语法是 C 的一个很小的子集,在处理文本时有一些额外的用于执行常用操作。如果您认为它超出了您的范围,那么您就想多了。

标签: shell awk grep


【解决方案1】:
$ awk '/^(ABC|MMM) /{print $NF}' file
1
3
4
5
22
3

【讨论】:

    【解决方案2】:

    awk 来救援!

    $ awk -F' *: *' '$1=="ABC" || $1=="MMM" {print $2}' file
    

    【讨论】:

      【解决方案3】:

      使用显示的示例,您能否尝试以下操作。用 GNU awk 编写和测试。

      awk -F'[[:space:]]*:[[:space:]]*' '/^(ABC +|MMM +)/{print $2}' Input_file
      

      【讨论】:

        【解决方案4】:

        我使用了王冰的解决方案,并且能够解决它

        cat file-log | grep -E "^ABC|^XYZ" | grep -v "ABC|XYZ" | grep -o '[0-9]\+' > result.txt
        

        【讨论】:

        • 感谢分享您正在使用的答案。恕我直言,您不需要为此使用这么多命令,您可以在一个 awk 左右执行此操作,您可以检查 karafka,我的答案将为您解决问题(为什么不用这么多命令来执行此操作不好,单个命令会容易管理,应该比使用多个命令更快(理想场景)),干杯。
        • 不要那样做。它冗长、漏洞百出、效率低下且不可移植。
        • 谢谢。我刚开始使用 bash,一定会听从您的建议
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-04
        • 1970-01-01
        • 1970-01-01
        • 2015-04-09
        • 2019-09-28
        相关资源
        最近更新 更多