首页 > 解决方案 > awk, sed, grep Linux 文件中的特定字符串

问题描述

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

 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 来完成。

标签: linuxbashawksedgrep

解决方案


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

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

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


推荐阅读