与grep相同匹配不同的打印


0

早些时候通过grep在这里获得了一些有价值的帮助,因此希望我也能解决这个问题。

这是来自Rclone日志

Transferred:      577.080M / 577.080 MBytes, 100%, 12.660 MBytes/s, ETA 0s
Errors:                 0
Checks:                 2 / 2, 100%
Transferred:            2 / 2, 100%
Elapsed time:       45.5s

我想做的是创建一个包含自定义文本的电子邮件通知。类似于“已传输577 MBytes,25.5个错误,在125.5 MBytes / s下的45.5秒内有0个错误的文件”

为此,我需要打印值。我没有运气就以以前的方式尝试过。在日志中将其传输了两次,如何拆分它们以获取TRF = 577.080Mbytes和TRS = 12.660 MBytes / s

TRF=$(grep -o 'Transferred:.*' $logfile| cut -d\   -f4)
ERR=$(grep -o 'Errors:.*' $logfile | cut -d\   -f4)
TIM=$(grep -o 'Elapsed time:.*' $logfile | cut -d\   -f3-)
TRS=$(grep -o 'Transferred:.*' $logfile | cut -d\   -f4)

您是否真的有两行都以开头Transferred:但以不同的格式给出不同的信息?
John1024

是的,很不幸
先知

Answers:


0

TRF

$ grep -Pom1 'Transferred:.*/ \K[^,]*' "$logfile"
577.080 MBytes
  • -P启用与Perl兼容的正则表达式,并在匹配的输出中\K不包含之前\K的内容
  • -o 仅输出线路的匹配部分
  • -m1在第一个匹配行之后退出以排除第二Transferred:

TRS

$ grep -Po 'Transferred:[^,]*,[^,]*, \K[^,]*' "$logfile"
12.660 MBytes/s
  • 与TRF相似:在第二个逗号+空格后获取所有内容,而不是逗号
  • 我们不需要-m1此处,因为该模式包含多个逗号

错误

$ grep -Po 'Errors:[[:space:]]*\K.*' "$logfile"
0
  • 仅获得行末的数字,去除空格字符

蒂姆

$ grep -Po 'Elapsed time:[[:space:]]*\K.*' "$logfile"
45.5s

传输的文件数:(这是两个数字中的第一个)

$ grep -Po 'Transferred:[[:space:]]*\K[0-9]+(?= /)' "$logfile"
2
  • (?= /)是正向超前(PCRE),我们正在寻找空格和/。这部分就像\K未包含在匹配的输出中,需要与第一Transferred行不匹配。

完善!非常感谢,正是我所需要的
prophetse7en

0

这种方法仅需一个过程即可创建整个输出线。因此,它应该比使用一系列grep和cut更快。另外,awk非常强大(例如,它可以执行浮点数学运算),如果您以后对输出进行增强,则它可能会很有用。

尝试:

$ awk '/ETA/{mb=$2; speed=$7" "$8} /Errors/{err=$2} /Transferred/{n=$2} /Elapsed/{printf "Transferred %s, %s files with %s errors in %s @ %s\n",mb,n,err,$3,speed}' rclone.log 
Transferred 577.080M, 2 files with 0 errors in 45.5s @ 12.660 MBytes/s,

这个怎么运作

  • /ETA/{mb=$2; speed=$7" "$8}

    如果当前行包含ETA(意味着它是第一Transferred行),则将第二个字段保存在中mb,并将第七和第八个字段保存在中speed

  • /Errors/{err=$2}

    如果此行包含Errors,则将第二个字段保存在中err

  • /Transferred/{n=$2}

    如果此行包含Transferred,请将第二个字段保存在变量中n

  • /Elapsed/{printf "Transferred %s, %s files with %s errors in %s @ %s\n",mb,n,err,$3,speed}'

    最后,当我们到达包含的行时Elapsed,打印出我们的消息。

多行版本

对于那些喜欢将代码分布在多行上的人:

awk '
/ETA/{
    mb=$2
    speed=$7" "$8
}
/Errors/{
    err=$2
}
/Transferred/{
    n=$2
}
/Elapsed/{
    printf "Transferred %s, %s files with %s errors in %s @ %s\n",mb,n,err,$3,speed
}' rclone.log 

谢谢,将在我尝试创建的脚本中对其进行测试:)
prophetse7en
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.