Как перебрать открытие и окончание строк в файле Bash? - PullRequest
0 голосов
/ 04 февраля 2019

Я пишу сценарий оболочки, чтобы перебирать строки и выводить совпадения, если слово присутствует в этом тестовом примере.

У меня есть файл, который выглядит как

/*
  some build info #which are not matter of interest
*/
Test: TestCase_one
.
.
   output of that testcase 
   #TestCase_one name will not be present in btw
.
.
TestCase_one passed 
Test: TestCase_two
.
.
   output of that testcase
.
.
   TestCase_two passed 
   many testcases in this pattern
/*
   some thread info
*/

в этомФайл выше, я хочу проверить для конкретного слова для каждого тестового случая и эхо-совпадений, если это слово присутствует, для этого я хочу просмотреть файл для каждого тестового случая, а затем шаг за шагом перейти к концу файла

Есть ли способ начать поиск слова между TestCase_one и TestCase_one Passed и т. Д.?

У меня нет опыта в написании сценариев оболочки, любые предложения или справочные страницы для достижения этого были бы полезны для меня.

ожидаемый результат должен выглядеть как

TestCase_one
No matches
TestCase_TWo
.
.
  matched lines
.
.

заранее спасибо

Ответы [ 3 ]

0 голосов
/ 04 февраля 2019

Некоторое время назад мне нужно было что-то подобное, поэтому у меня есть кое-что, что может вам помочь -

    #!/bin/bash

    checking_start=1 # flag for start of test case
    processing=0 # flag for processing a test case

    while IFS="" read -r p || [ -n "$p" ]; do # "p" is line in text file
        if [ $checking_start -eq 1 ]; then # checking for test case start
            mystartstr=`echo "$p" | grep Test: ` 
            if [ -z "$mystartstr" ]; then # if "mystartstr" is empty, continue
                echo "Non-related"
            else
                echo "Started processing.." # else set processing flag
                processing=1 # processing now true
                checking_start=0 # checking start of test case flag- false
            fi
        elif [ $processing -eq 1 ]; then  # if processing come here
            myendstr=`echo "$p" | grep TestCase_` # checking end of test case string
            if [ -z "$myendstr" ]; then # if end test case string empty, continue processing
                echo "Processing.." # This is where you will put your grep
            else
                echo "Ended processing.."  # Else end processing
                processing=0 # processing flag set as false
                checking_start=1 # start checking for new test case start
            fi
        else
            echo "No where.. Should never come here"
        fi
    done < sample.txt # Piping your text file here

Я использовал sample.txt -

    /*
      some build info #which are not matter of interest
    */
    Test: TestCase_one
    .
    .
       output of that testcase
    .
    .
    .
    TestCase_one passed
    Test: TestCase_two
    .
    .
       output of that testcase
    .
    .
    TestCase_two passed
       many testcases in this pattern
    /*
       some thread info
    */
0 голосов
/ 09 февраля 2019

Версия awk:

awk <test.log -v k='MATCHWORD' -e '
    $1=="Test:" { print n=t=$2; next }
    t && $0~k   { n=0; print }
    $1==t && n  { t=0; print "No matches" }
'
  • k: переменная, содержащая слово для совпадения
  • t: переменная, содержащая имя тестового примера
  • n: переменная, указывающая, если слово еще не найдено в этом тестовом примере
  • $1=="Test:": начало тестового набора?
  • t && $0~k: в тестовом примере и в строке содержится слово?
  • $1==t && n: конец контрольного примера и слово не найдено?
0 голосов
/ 04 февраля 2019

Я полагаю, что вы следующее:

Между «Test: Testcase» и «TestCase _. * Пройдено» поиск строки «foo».Напечатайте совпадающие строки, если есть совпадение.

Не могли бы вы просто сделать:

cat bigfile | grep -E '(foo|^Test: TestCase)'

Это не будет соответствовать вашему ожидаемому выводу идеально (например, «Нет совпадений» не будет напечатано - тампросто не будет совпадений), но это довольно близко и очень просто.

Если вам не нужны все тесты, но вы хотите посмотреть на один, это может сработать для вас:

cat file |
  perl -ne '/^Test: Testcase start/ .. /Test case end/ and /foo/ and print'

Он будет искать foo, но только между Test: Testcase start и Test case end.Если вы хотите включить начальную строку в вывод, используйте:

cat file |
  perl -ne '/^Test: Testcase start/ .. /Test case end/ and /^Test: Testcase start|foo/ and print'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...