LINUX.ORG.RU

выбрать значение из файла (bash csript)


0

0

Мне много раз помогали на это форуме, поэтому я снова тут :-) В общем, есть текстовый файл (test) в нем есть строчка такого рода: traffic: <число1>:<число2>+<число3>:<число4>+<число5>:<ч исло6>

Необходимо получить быстрый доступ к этим <числоN>, чтобы ее значение можно было передать переменной (6-ти переменным). Как это красивее сделать средствами баша? Что-то мне подсказывает, что, "взять" значение так: chislo2=`cat test |grep traffic|awk -F+ '{print $1}'|awk -F: '{print $2}'` будет не очень рационально.

anonymous

ну в любом случае тебе придется проход по файлу делать.

LINE=`cat test | awk '/^traffic / { print; exit }'`

а дальше парси эту строку как хочешь..

dilmah ★★★★★
()

Примерно так:
{
   read N1
   read N2
   ...
   read N7
} < <(tr '+' ':' < test|awk -F: '$1=="traffic" {
   print $2
   print $3
   ...
   print $7
}')

`<(command)' - башизм и Z-шизм, и на других shell может не работать.
Создает временный fifo. Если нужна переносимость, то fifo создавай явно.

Еще можно сделать через eval. Похожий вопрос недавно всплывал на этом форуме - в поиск.

kosmonavt
()

-F в awk --- это regexp, так что, можно не городить два awk'а, а обойтись одним. И grep не нужен, раз уж awk. И cat с лишним прогоном через pipe тоже. В общем, awk велик и могуч :)

watashiwa_daredeska ★★★★
()

eval `awk -F "[\+:]" '/^trafic/ {print "var1=" $2 "; var2=" $3}' test`

ну и соответственно прописать столько пар "varN=" $N+1, сколько нужно

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

Не удержался
$ echo "traffic:12:23+45:56+76" | \
  awk -F'[:+]' '$1 == "traffic" {for (i=1; i<=NF; i++) print "var"i"="$i";"}'
var1=traffic;
var2=12;
var3=23;
var4=45;
var5=56;
var6=76;

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

Башизм

$ arr=(`echo "traffic:12:23+45:56+76"|sed '/^traffic/s/[:+]/ /g'`) $ for ((i=0; i<${#arr}; i++));do echo ${arr[$i]};done traffic 12 23 45 56 76

anonymous
()
Ответ на: комментарий от sdio

Башизм

$ arr=(`echo "traffic:12:23+45:56+76"|sed '/^traffic/s/[:+]/ /g'`) $ for ((i=0; i<${#arr}; i++));do echo ${arr[$i]};done traffic 12 23 45 56 76

anonymous
()

$ IFS=":+" read -a x < <(echo 6:5+4:3+2:1)
$ echo ${x[5]}
1
$ echo ${x[0]}
6

io ★★
()

IMHO так будет наиболее быстро (если там только одна строка):

STRING=`cat file`
X=1

while true; do
eval VAR${X}=`echo ${STRING}|cut -d ':' -f ${X}`
let X=X+1
if [ ${X} -eq 6 ]; then break; fi
done

saper ★★★★★
()

однако, TIMTOWDY

(я не автор вопроса ;)

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