Как мне разобрать строку через файл в bash


0

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

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

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

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

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

например, я хочу перебрать текстовый файл с именем «ИМЯ ФАЙЛА», который выглядит следующим образом

30 '!' C Client/test.js

31 '!' C Client/test2.js

32 '!' C Client/test3.js `

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

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

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

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


Я не совсем уверен, что вы пытаетесь сделать, но, как это звучит, все, что вам нужно, уже есть. Проверьте инструмент grep.
SBI

Пожалуйста, включите несколько конкретных примеров. Покажите нам ваш входной файл и ожидаемый результат. У вас есть одно ключевое слово или много?
terdon

@terdon я редактировал свой вопрос
Riddle

Ответы:


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> 

Не работайте с правами root в оболочке, просто чтобы извлечь строку из файла.
ott--

Я пока не занимаюсь форматированием :)
madlynx

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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.