gpt4 book ai didi

regex - 将 bash 变量作为数字文字与 grep 匹配

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:27:21 25 4
gpt4 key购买 nike

我有一个 (GNU) bash 脚本,它在一个文件中建立两个要匹配的变量。

hour=$(head -n 1 sensorstest.log | cut -f5 | cut -d"-" -f1)
dom=$(head -n 1 sensorstest.log | cut -f5 | cut -d"-" -f4)

...并将它们与文件中的其他匹配项

grep -E [^0-9]+"$hour"-[0-9]+-[0-9]+-"$dom"-[0-9]+-[0-9]{4} sensorstest.log

下面是计算输入文件字段 2 中给定时间的所有值的平均值的脚本示例。

hMean=$(grep -E [^0-9]+"$hour"-[0-9]+-[0-9]+-"$dom"-[0-9]+-[0-9]{4} sensorstest.log | cut -f2 | awk ' {sum+=$
1}{count++}{mean=sum/count} END {printf("%.2f",mean) } ' );

这里是一个清理输入文件的例子。

echo "removing: "$hour"th hour of the "$dom"th day  of the "$month"th month"
sed -i -r '/'"$hour"'-[0-9]+-[0-9]+-'"$dom"'-'"$month"'-[0-9]{4}/d' sensorstest.log

最后...这是文件中的示例行:

格式为:

状态 湿度 温度 unix时间戳 时间/日期

OK 94.4 16.9 1443058486 1-34-46-24-9-2015

我正在尝试匹配文件中第一个条目的 day hour 的所有实例。

然而,这对于小于 9 的数字工作正常;

问题:大于 9 的数字被匹配为两个单位数字,导致 12 匹配 1、2、12、21 等。

这是一个在哪里绊倒的例子:

OK 100 17.2 1442570381 9-59-41-18-9-2015

OK 100 17.1 1442570397 9-59-57-18-9-2015

Moistening 100 17.6 1442574014 11-0-14-18-9-2015

Moistening 100 17.6 1442574030 11-0-30-18-9-2015

此处输出跳至 0-0-0-19-9-2015(是的,我从日志中遗漏了一个小时的条目)

$ sudo statanhourtest.sh

100,1.4,1.40,-98.6 16.5,17.2,16.90,.7 1442566811 9-0-0-18-9-2015

removing: 9th hour of the 18th day of the 9th month
$ sudo statanhourtest.sh

100,1.4,1.40,-98.6 18.3,18.8,18.57,.5 1442620804 0-0-0-19-9-2015

removing: 0th hour of the 19th day of the 9th month

问题只发生在小时内。 ($dom) 匹配得很好。

我已经尝试在 grep 中使用 -w 选项,但我认为这只会返回我需要整行的精确匹配。

网上关于在 grep 中逐字匹配数字的内容不多。而且我没有发现将 bash 变量用作数字文字。

任何帮助或相关链接将不胜感激。

编辑:经过一夜的脚本疏通,我已经解决了这个问题。问题出在我最后的 sed 表达式上。问题在于 sed 表达式的单引号部分和由 shell 扩展的双引号变量。我从另一个线程的建议中得到了这个。双引号整个表达式解决了这个问题。

awk 建议大大提高了脚本的效率和准确性。再次感谢。

最佳答案

awk 来拯救!

我认为您可以将所有内容组合到一个简单的 awk 脚本中,而无需任何正则表达式。例如,

awk 'NR==1{split($NF,h,"-")} {split($NF,t,"-")} t[1]==h[1] && t[4]==h[4]'

将解析文件第一行的时间戳,只过滤小时和日期匹配的记录。

这将取字段 2 的平均值

awk 'NR==1
{
split($NF,h,"-")
}
{
split($NF,t,"-")
}
t[1]==h[1] && t[4]==h[4]
{
sum+=$2;
c++
}
END
{
print "Average: " sum/c
}'

关于regex - 将 bash 变量作为数字文字与 grep 匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32752104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com