Я очень новичок в написании сценариев оболочки. У меня был небольшой запрос на разбор файла.

Итак, вот что я пытаюсь сделать:
Я запускаю команду слияния svn, и файл конфликта genaratea мой файл конфликта сохраняется как конфликт.txt

То, что я хочу сделать, это прочитать этот файл построчно и проанализировать одну строку, чтобы сопоставить с некоторыми ключевыми словами.

Например, одна из строк в файлах выглядит так:
C Client/Game/src/test/test.php

Теперь я хочу проанализировать эту строку и выполнить поиск ключевого слова test ; в случае, если я ее обнаружу, я хочу выполнить с ней какие-либо действия, например, прервать со статусом выхода 2, 3 и т.д.

например, я хочу перебрать текстовый файл с именем "FILENAME", который выглядит следующим образом

30 '!' C Client/test.js

31 '!' C Client/test2.js

32 '!' C Client/test3.js `

то, что я делаю, это перехватывает файл, используя цикл while и cat commnad

cat $FILENAME | while read LINE do echo $LINE done

здесь я просто печатаю строку, я хочу знать, как я могу найти keyworkd в строке, и если я найду это ключевое слово, как я могу выполнить какое-то действие, например, выход из состояния 1

Можете ли вы предложить какой-нибудь способ сделать это ..

3 ответа3

2

Есть много способов сделать это, в зависимости от ваших потребностей.

  1. Просто напечатайте все строки, содержащие ключевое слово test:

    grep test file.txt
    
  2. То же самое, но для многих ключевых слов. Создайте файл, содержащий все ключевые слова, по одному в строке, и запустите

    grep -f keywords.txt file.txt
    
  3. Обработать файл построчно, выйти, если строка найдена

    while read line; do echo $line | grep test && break; done < file.txt
    
  4. Выход со статусом 1, если строка совпадает. К сожалению, если я правильно помню (не уверен на 100%), bash позволяет устанавливать только возвращаемые значения в функциях. Итак, для получения статуса выхода нужно использовать что-то еще. Perl например:

    perl -ne '/test/ && exit(1)' file.txt
    
  5. Хотя вы не можете установить выходное значение, вы все равно можете сделать что-то подобное с bash. Выходное значение последнего запуска команды всегда сохраняется как $? в bash это означает, что вы можете проверить значение $? и действовать соответственно:

    while read line; do let c++; echo $line | grep test >/dev/null; 
      if [[ $? == 0 ]] ; then echo Match for line $c : $line;
      else echo No match for line $c; fi  
    done < file.txt 
    
0

Самый простой способ - вообще не разбирать файл построчно.

grep -q 'keyphrase' filename && exit <exitcode> 
0
$ function some_action { 
    echo found keyword
}

$ if grep -q -m1 -e 'test3' < input;
  then 
      some_action
  fi
found keyword

параметры grep:

  • -q: тихо; не печатать спички
  • -m1: выход после одного матча
  • -e: выражение (ключевое слово)

например:

$ grep . input
30 '!' C Client/test.js
31 '!' C Client/test2.js
32 '!' C Client/test3.js

$ if grep -q -m1 -e 'test3' < input; then some_action ; fi
found keyword

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .