【问题标题】:awk, sed, grep specific strings from a file in Linuxawk, sed, grep Linux 文件中的特定字符串
【发布时间】:2021-06-19 21:37:39
【问题描述】:

这是我要过滤的完整文件的一部分:

 Hashmode: 13761 - VeraCrypt PBKDF2-HMAC-SHA256 + XTS 512 bit + boot-mode (Iterations: 200000)

Speed.#2.........:     2038 H/s (56.41ms) @ Accel:128 Loops:32 Thr:256 Vec:1
Speed.#3.........:     2149 H/s (53.51ms) @ Accel:128 Loops:32 Thr:256 Vec:1
Speed.#*.........:     4187 H/s

目的是打印以下内容: 13761 VeraCrypt PBKDF2-HMAC-SHA256 4187 H/s

这是我尝试过的。 完整的文件称为complete.txt

cat complete.txt | grep Hashmode | awk '{print $2,$4,$5}' > mode.txt

输出:

 13761 VeraCrypt PBKDF2-HMAC-SHA256 

然后:

cat complete.txt | grep Speed.# | awk '{print $2,$3}' > speed.txt

输出:

 4187 H/s 

然后:

paste mode.txt speed.txt

问题是行不匹配。文件“complete.txt”中有大约 200 种模式可供过滤

我也有一种感觉,这可以通过使用sed 或 awk 的更简单的命令来完成。

【问题讨论】:

  • 您的格式似乎有些不稳定;输出前后真的应该有空格吗?这些命令也不会产生您声称它们产生的内容(特别是,Speed 命令应该获取与您的示例匹配的所有行)。
  • 顺便说一句,你想避免useless cat,也可能是useless grep.

标签: linux bash awk sed grep


【解决方案1】:

我猜你正在寻找类似下面的东西。

awk '/Hashmode:/ { if(label) print label, speed; label = $2 " " $4 " " $5 }
  /Speed\.#/ { speed = $2 " " $ 3 }
END { if (label) print label, speed }' complete.txt

我们将Hashmode 行与后面的last Speed.# 行匹配,然后在我们看到新的哈希模式或到达文件末尾时打印。 (未能打印最后一个是常见的初学者错误。)

【讨论】:

    【解决方案2】:

    这可能对你有用(GNU sed):

    sed -E '/Hashmode:/{:a;x;s/^[^:]*: (\S+) -( \S+ \S+ ).*\nSpeed.*:\s*(\S+ \S+).*/\1\2\3/p;x;h;d};H;$!d;ba' file
    

    如果一行包含Hashmode,则交换到保留空间并使用模式匹配,将其内容操作为所需的格式并打印,交换回模式空间,将当前行复制到保留空间并删除当前行。

    否则,将当前行附加到保留空间并删除当前行,除非当前行是文件中的最后一行,在这种情况下处理该行,就好像它包含Hashmode

    注意第一次遇到Hashmode,没有任何输出。后续匹配和文件结束条件将是唯一发生打印的时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-25
      • 2023-01-28
      • 1970-01-01
      • 2021-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      相关资源
      最近更新 更多