LINUX.ORG.RU

вопрос по скрипту на bash


0

0

Привет!

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

написал такой скрипт:

#!/opt/OpenSource/bin/bash file="VG2T_tstr.pc"; result=$(grep "DFPN .*102.*,.*,.*" "$file"); if [ "$?" -eq "0" ] then echo "File: $file" echo $result; fi

в его выводе получаю:

bash-2.04$ ./test.sh File: VG2T_tstr.pc DFPN 10203,"121",(AD16) DFPN 10204,"125",(AD18) DFPN 10102,"129",(AD20) DFPN 10210,"107",(AD11) DFPN 10209,"112",(AD14) DFPN 10207,"113",(AD15) DFPN 10211,"102",(AD8) DFPN 10212,"100",(C_Be0) DFPN 10206,"120",(C_Be2)

не могу решить две проблемы:

1) почему то теряются символы переноса строки, т.е. сам по себе grep выдает построечно, а применяя его в данном скрипте получаю все в сплошной строке.

2) как можно проставить таблуляции в начало строк-совпадений?

anonymous

На первый вопрос можно ответить 'echo "$result"', но лучше так не делать, во первых есть опция -H, а во вторых, результат grep'а может быть очень большим, поэтому лучше не засовывать его в переменную, можно содавать временный файл.

Я не совсем понял куда надо ставить табуляции, но sed вам в помощь, например:

echo "$result" | sed s/^/$'\t'/

mky ★★★★★
()
Ответ на: комментарий от mky

> поэтому лучше не засовывать его в переменную, можно содавать временный файл.

ну это только при очень больших результатах. Я сравнивал работу bash-скриптов которые работают с файлами со скриптами которые всё хранят в памяти. Так вот файловый ввод-вывод очень сильно тормозил(в разы). Лучше потратить пару метров оперативы чем шуршать диском.

Девелоперы bash писали что у bash никаких трудностей работы с большими переменными нет. Правда, на сколько большие переменные они имели в виду не сказали.

true_admin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.