Linux 如何使用Grep命令在文本文件中查找特定值

Linux 如何使用Grep命令在文本文件中查找特定值,linux,bash,shell,awk,grep,Linux,Bash,Shell,Awk,Grep,我需要grep一个名为daily_failures_count.csv的文件,但只查找失败次数。 在该文件中,以较短的比例显示: January,1,0,0 January,1,1,0 January,1,2,0 January,1,3,0 January,1,4,0 January,1,5,0 January,1,6,0 January,1,7,0 January,1,8,0 它的格式是“月、日、小时、失败”,它贯穿了所有的月份。最后一个值是当时发现的故障数。我知道这里都写着0,但那是因为没

我需要grep一个名为daily_failures_count.csv的文件,但只查找失败次数。 在该文件中,以较短的比例显示:

January,1,0,0
January,1,1,0
January,1,2,0
January,1,3,0
January,1,4,0
January,1,5,0
January,1,6,0
January,1,7,0
January,1,8,0
它的格式是“月、日、小时、失败”,它贯穿了所有的月份。最后一个值是当时发现的故障数。我知道这里都写着0,但那是因为没有发现失败,其他日期也有失败

我不太擅长Linux脚本中的grep命令,所以我的问题是,如何通过grep只找到文件中的最后一个数字

我正在一个名为make_accum_fail_counts.sh的文件中编写此脚本,我将按如下方式运行它:

bash make_accum_fail_counts.sh daily_fail_counts.csv > accum_fail_counts.csv
因此,我使用daily_fail_counts.csv作为新脚本的输入。以下是我目前的脚本:

#!/bin/bash

if [ $# == 1 ]
then
    logFile=$1
fi

cat $logFile > tmpFile

hour=0
failure=0

while [ $hour -le 23 ]
do
    if [ $hour -le 23 ]
    then
        failure=`grep "*,*,*,^[0-10]" tmpFile | wc -l`
    fi
    echo "$hour,$failure"
    hour=$((hour+1))
    failure=0
done
rm -rf tmpFile
我只需要grep命令的帮助:

failure=`grep "*,*,*,^[0-10]" tmpFile | wc -l`
只是为了在所有的日子里,时时刻刻发现失败。所以它的输出是:

0,1000
1,1040
2,2888

其中0:00-1:00之间有1000次故障,1:00-2:00之间有1040次故障,依此类推。提前谢谢。

如果我正确理解了您的问题,请您尝试以下内容。这将提供故障总数(最后一个字段/第四个字段),按小时值计算,不考虑月份

awk '
BEGIN{
  FS=OFS=","
}
!b[$3]++{
  c[++count]=$3
}
{
  a[$3]+=$4
}
END{
  for(i=1;i<=count;i++){
    print c[i],a[c[i]]
  }
}
'  Input_file
总结所有的失败。使用
cut-d','-f4 yourfile.csv
分割逗号上的每一行,然后得到第四个值,这将为您提供一个数字列表

您可以grep将其过滤到小时,例如

cat yourfile.csv | cut -d',' -f 3,4 | grep ^0, | cut -d',' -f 2
获取所有第0小时故障计数

for hour in {0..23}; do
    cat yourfile.csv | cut -d',' -f 3,4 | grep ^$hour, | cut -d',' -f 2 | paste -s -d+ - | bc
done
以获取每小时的总数

如果您想按天对它们进行分组,您可以阅读有关
date
命令的内容,了解如何使其输出字符串,如
January,1,
,并向上述命令添加一个外部
for
循环,该循环通过
grep
命令的输出,每一行都通过
date


就个人而言,此时我将开始编写Python而不是bash。
pandas
库更适合这种情况。

我不熟悉awk,有没有办法简单地使用grep来计算故障数?@Tristan,相信我
awk
会容易得多,默认情况下在服务器中使用。对于
grep
来说,这将是一项艰巨的任务,您可能还需要使用其他工具,请让我知道您是否有任何疑问?@Tristan,我现在也为您的理解添加了解释。如果最后一个数字后面没有空格,
grep-ohE'[[:digit:]$”您的文件
就可以了。然而,最后一个数字告诉你什么?如果错误数为
10
,则最后一位数字为
0
,这与无错误相同。如果所有行都具有完全相同的结构,
cut-d','-f4 YOURFILE
将只给出每行的最后一个数字,这可能会更有用。或者与grep一起使用模式
[[:digit:]+$
,该模式还返回最后一个数字。
cat yourfile.csv | cut -d',' -f 3,4 | grep ^0, | cut -d',' -f 2
for hour in {0..23}; do
    cat yourfile.csv | cut -d',' -f 3,4 | grep ^$hour, | cut -d',' -f 2 | paste -s -d+ - | bc
done