2017-01-12 4 views
1

У меня есть файл в моей файловой системе. Я хочу прочитать этот файл в сценарии bash. Формат файла отличается. Я хочу читать только выбранные значения из файла. Я не хочу читать весь файл, так как файл очень большой. Ниже представлен мой формат файла:Прочитать файл в скрипте Bash

Name=TEST 
Add=TEST 
LOC=TEST 

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

В настоящее время я делаю это, чтобы прочитать файл:

file="data.txt" 
while IFS= read line 
do 
    # display $line or do somthing with $line 
    echo "$line" 
done < "$file" 

ответ

4

Используйте правильный инструмент, предназначенный для работы, Awk в этом случае чтобы ускорить процесс!

dateValue="$(awk -F"=" '$1=="Add"{print $2; exit}' file)" 
printf "%s\n" "dateValue" 
TEST 

Идея заключается в том, чтобы разделить входные линии на = как де-ограничитель. Логика awk работает, проверяя поле $1, которое равно Add и печатает соответствующее значение, связанное с ним.

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

+0

«Выйти» действительно факультативно? – codeforester

+1

@codeforester: 'optional' as in, команда будет работать до тех пор, пока в' Add' нет одинаковых значений '$ 1'. Но в случае, если его нет, команде потребуется слишком много времени для работы в большом файле, но, тем не менее, будет выполнять эту работу. – Inian

2

Вы можете переписать ваш цикл таким образом, обратите внимание на break после вы получили свою линию:

while IFS='=' read -r key value; do 
    if [[ $value == "Add" ]]; then 
    # your logic 
    break 
    fi 
done < "$file" 

Если ваше намерение просто получить самое первое вхождение «Add =», то вы можете использовать grep таким образом:

value=$(grep -m 1 '^Add=' "$file" | cut -f2 -d=) 
+0

Оцените свой ответ в 'bash', но на самом деле это не инструмент для обработки при рассмотрении производительности, прочитайте http://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop- to-process-text-thought-bad-practice для подробного/хорошо объясненного исследования этого – Inian