Как использовать команды Grep для поиска определенного значения в текстовом файле - PullRequest
2 голосов
/ 08 ноября 2019

Мне нужно найти файл с именем daily_fails_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 в скриптах Linux, поэтому мой вопрос в том, как мне выполнить 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

Там, где было 1000 сбоев между 0: 00-1: 00, 1040 сбоев между 1: 00-2: 00 и так далее. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 08 ноября 2019
cat yourfile.csv | cut -d',' -f 4 | paste -s -d+ - | bc

Для суммирования всех неудач. Используйте cut -d',' -f 4 yourfile.csv, чтобы разбить каждую строку на запятые и получить 4-е значение, которое даст вам список чисел, затем используйте команду оболочки для суммирования списка чисел .

* 1006. * Вы можете 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 лучше подходит для этого.

1 голос
/ 08 ноября 2019

Если я правильно понял ваш вопрос, не могли бы вы попробовать следующее. Это обеспечит общее количество сбоев (последнее поле / четвертое поле) по значениям в часах и независимо от месяца.

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

Еще одна вещь, этот подход обеспечит вывод в том же порядке, в котором $3входящий в Input_file.

Объяснение: Добавление пояснения к приведенному выше коду здесь.

awk '                          ##Starting awk program here.
BEGIN{                         ##Starting BEGIN section from here.
  FS=OFS=","                   ##Setting FS and OFS as comma here.
}                              ##Closing BLOCK for BEGIN section here.
!b[$3]++{                      ##Checking condition if $3 is NOT present in array b then do following + it is placing $3 in array b.
  c[++count]=$3                ##Creating an array named c whose index is variable count and value is $3, variable count value is keep increasing with 1.
}                              ##Closing BLOCK for array b condition here.
{
  a[$3]+=$4                    ##Creating an array named a with index $3 and value is $4 and its keep adding its value to its own same index value.
}
END{                           ##Starting END section of this program here.
  for(i=1;i<=count;i++){       ##Starting for loop from i=1 to till value of count variable here.
    print c[i],a[c[i]]         ##Printing array c value index variable i and printing array a value whose index is array c with index variable i.
  }                            ##Closing BLOCK for, for loop here.
}                              ##Closing BLOCK for END section of this program here.
'  Input_file                  ##Mentioning Input_file name here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...