Как я могу напечатать первую совпавшую строку, используя sed или grep? - PullRequest
0 голосов
/ 18 мая 2018

У меня есть файл конфигурации, где каждая строка имеет формат, скажем UniqueOption = SomeValue:

$ cat somefile  
option1sub1 = yes
option1sub2 = 1234
...
option1subn = xxxx
option2 = 2345
option3 = no
...

Я хочу иметь дело с каждым значением "option1" в цикле.но, sed или grep дают мне все option1 за один раз.

Как я могу добиться этого, используя sed или grep, получая по одной строке option1 за раз?

Ответы [ 5 ]

0 голосов
/ 18 мая 2018

С sed

sed '/^option1.* = /!d;s///' somefile

С GNU grep 2.20 (поддержка pcre)

grep -oP '^option1.* = \K.*' somefile

Если вы хотите получить только первый матч

sed '/^option1.* = /!d;s///;q' somefile

grep -m1 -oP '^option1.* = \K.*' somefile
0 голосов
/ 18 мая 2018

Мы уже можем видеть несколько удивительных ответов, но, как вы спросили что-то с помощью grep, вы можете использовать одно из следующих, если хотите.
Для всех значений

grep option1 m | cut -d "=" -f2 | awk '{$1=$1};1'

Для первого значения

grep option1 m | cut -d "=" -f2 | awk '{$1=$1};1' | head -1  

Здесь: cut используется для вырезания второй опции uisng dilimiter =;awk используется для обрезки пробелов в выводе, а head используется для печати первого вхождения

0 голосов
/ 18 мая 2018

Решение 1-е: После awk может помочь вам получить значение option1 последнего значения строки.

awk -F" = " '/^option1/{print $NF}'  Input_file

Решение 2-е: Выше будут напечатаны все значения строки option1, если вам нужно только самое первое значение строки option1, затем используйте следующее.

awk -F" = " '/^option1/{print $NF;exit}'  Input_file
0 голосов
/ 18 мая 2018

Следующая команда проанализирует все подопции для option1 в файле file.conf и сохранит их в массиве bash.Затем к этим массивам легко получить доступ к параметрам.

#!/bin/bash

while IFS= read -r data; do
    opt1+=( "$data" )
done < <( awk -F ' *= *' '$1 ~ /^option1/ { print $2 }' file.conf )

printf 'Option 1, sub-option 1 is "%s"\n' "${opt1[0]}"

Вывод:

Option 1, sub-option 1 is "yes"

Сценарий awk вернет все после = (и любых пробелов), чтопозволяет хранить данные, содержащие несколько слов.Обрабатываются только строки, начинающиеся с option1 в файле конфигурации.

Это может быть использовано для анализа всего файла конфигурации в единую структуру, возможно, с использованием ассоциативного массива в достаточно недавней версии bash.

0 голосов
/ 18 мая 2018

передать вывод grep в while петлю:

grep 'option1' somefile | while read line
  do
  echo "single option is in var $line"
  done
...