Как я могу прочитать конкретную строку и конкретное поле, используя Bash? - PullRequest
0 голосов
/ 17 октября 2011

У меня есть этот файл, и я хочу получить только значение testme =, чтобы я мог выполнить другое действие. Но это бросает много строк и фактически не может заставить это работать.

1. test.sh

#!/bin/bash
for i in $(cat /var/tmp/test.ini); do
  # just one output i need: value1
  grep testme= $i 
done

2. /var/tmp/test.ini

; comments
testme=value1
; comments
testtwo=value2

Ответы [ 5 ]

2 голосов
/ 17 октября 2011

Я проверил ваши коды, проблема в вашем цикле for.

вы фактически читаете каждую строку файла и передаете ее в grep, что НЕ правильно.Я думаю, у вас есть много строк с ошибкой,

нет такого файла или каталога

(или что-то в этом роде).

вы должны дать grep имя вашего файла.(без цикла for)

например

grep "testme=" /var/tmp/test.ini
2 голосов
/ 17 октября 2011

Как насчет

#!/bin/bash

grep 'testme=' /var/tmp/test.ini | awk -F= '{ print  $2 }'

или, альтернативно, просто используя bash

#!/bin/bash

regex='testme=(.*)'

for i in $(cat /var/tmp/test.ini);
do
    if [[ $i =~ $regex ]];
    then
        echo ${BASH_REMATCH[1]}
    fi
done
1 голос
/ 17 октября 2011

Как насчет этого?

$ grep '^testme=' /tmp/test.ini  | sed -e 's/^testme=//' 
value1

Мы находим строку и затем удаляем префикс, оставляя только значение. Grep выполняет итерации для нас, нет необходимости быть явным.

1 голос
/ 17 октября 2011
grep -v '^;' /tmp/test.ini | awk -F= '$1=="testme" {print $2}'

grep удаляет комментарии, затем awk находит переменную и печатает ее значение. Или то же самое в одной строке awk:

awk -F= '/^\s*;/ {next} $1=="testme" {print $2}' /tmp/test.ini 
0 голосов
/ 18 октября 2011

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

while IFS== read lhs rhs; do
  if test "$lhs" = testme; then
     # Here, $rhs is the right hand side of the assignment to testme
  fi
done < /var/tmp/test.ini
...