如何选择具有匹配项的文件的每一行并对其进行操作?

时间:2019-06-03 15:15:34

标签: bash awk

我在使用Geth进行挖掘之后正在制定基准。这是一个简单的bash脚本。我将终端的日志保存在txt文件中。我需要在第三个字段中找到写有“提交”的每一行。我用命令

找到了它
awk /'new mining work/ {print $2,$3}' /home/ubuntu/geth-general/node1.txt 

结果与此类似:

[06-03|12:15:19.020] Commit
[06-03|12:15:20.009] Commit
[06-03|12:15:21.008] Commit
[06-03|12:15:22.003] Commit
[06-03|12:15:23.011] Commit
[06-03|12:15:24.009] Commit
[06-03|12:15:25.005] Commit
[06-03|12:15:26.006] Commit
[06-03|12:15:27.005] Commit
[06-03|12:15:28.010] Commit
[06-03|12:15:29.017] Commit

我需要将每个时间戳记行保存为一个变量,并找到连续的行(感谢时间)。我当时在考虑一个FOR循环,但是我不能选择一行。

我尝试了awk“ NR”的功能,但未显示任何结果。

awk /'new mining work/ {if(NR==5) print $2,$3}' /home/ubuntu/geth-general/node1.txt

awk /'new mining work/ && NR==3 {print $2,$3}' /home/ubuntu/geth-general/node1.txt

我希望输出:

[06-03|12:18:37.014] Commit

例如,然后我可以将其放入变量和过程中,以进行下一个操作,例如

[06-03|12:18:38.016] Commit

1 个答案:

答案 0 :(得分:2)

如果要查找匹配的第五行并打印该行和所有后续的匹配行:

awk '/new mining work/ && ++count >= 5 {print $2,$3}' /home/ubuntu/geth-general/node1.txt

这将预增加计数变量(由于短路评估,仅当正则表达式匹配成功时)。

您也可以使用该count变量来测试范围:

awk '/new mining work/ && ++count >= 5 && count <=23 {print $2,$3}' /home/ubuntu/geth-general/node1.txt

这将在第23次找到匹配项后停止打印。

请注意,我更正了单引号的位置。