LINUX.ORG.RU

А как из проги(awk) записать на stdout имена двух файлов содержащих по пробелу дабы будучи подставлены в командную строку другой нормально воспринялись????


0

0

На текущий момент они воспринимаются как четыре имени. пробовал екранировать пробелы при помощи \ - ничего не получается. Запускаю например так:

tar -czf example.tar `awk'{print $1 " " $2;}'`

непосредственно передать тару $1 && $2 нельзя так как они вычисляются awk

Пробовал загнать вывод awk в переменную и передать переменную - результат ещё хуже

★★★★★
Ответ на: комментарий от cvv

А ещё варианты/идеи есь???

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

>set `echo a b | awk '{print "'\''" $1 "'\'' '\''" $2 "'\''"}'`; echo $1, $2

А как надо екранировать в таком случае

set `echo | gawk '{a="a b";b="c d";print "'\''" a "'\'' '\''" b "'\''"}'`; echo $1, $2

??

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

А понятно.. не экранирование не работает, а кавычки ' уже не воспринимаются как управляющие символы.
Тогда остаётся только первый вариант:
bash -c "a(){ echo \$1, \$2; }; a '`echo | awk '{a="a b";b="c d"; print a "'\'' '\''" b }'`'"

Единственно можно ещё ' тоже в awk внести чтобы было несколько понятней:
bash -c "a(){ echo \$1, \$2; }; a `echo | awk '{a="a b";b="c d"; print "'\''" a "'\'' '\''" b "'\''" }'`"
Хотя конечно, что так понятней довольно спорно..

На самом деле сомневаюсь, что можно сделать проще..
Удачи!

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

Благодарю за помощь, но етот вариант скорее всего будет бесполезен.

with best regards Vitaly

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

Такой вариант: в awk разделять имена не пробелом, а "\000", и потом читать
вывод с помощью "xargs -0 tar ..." или "tar --null -T - ...".

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

Спасибо. Будет время повникаю

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

А ещё обнаружил рульную мысль на тему поигратся переменной IFS.

cvv ★★★★★
() автор топика

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

awk '{print $1 " " $2}' > /tmp/files.list
tar -czf example.tar.gz -T /tmp/files.list
rm /tmp/files.list

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

Нет ибо постоянно натыкаюсь на ето же в прогах которые не поддерживают файлы со списками. например dialog

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

в таком случае можно сгенерировать нужную команду во временном файле,
и затем выполнить ее в контексте данного скрипта:

awk 'BEGIN {command="dialog blah-blah"};
           {command=command" \""$1" "$2"\""};
       END {print command}' > /tmp/command.tmp
source /tmp/command.tmp

в /tmp/command.tmp будет
dialog blah-blah "line1 with_space" "line2 with_space"


или 


eval `awk 'BEGIN {command="dialog blah-blah"};
                 {command=command" \""$1" "$2"\""};
             END {print command}'`

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

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

>awk 'BEGIN {command="dialog blah-blah"}; > {command=command" \""$1" "$2"\""}; > END {print command}' > /tmp/command.tmp >source /tmp/command.tmp

>в /tmp/command.tmp будет >dialog blah-blah "line1 with_space" "line2 with_space"

тоже рабочий вариант

>eval `awk 'BEGIN {command="dialog blah-blah"}; > {command=command" \""$1" "$2"\""}; > END {print command}'`

сомневаюсь в работоспособности. Без изменения IFS eval неправильно розпарсит вывод awk.

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

Зря сомневаешься.
Оба варианта одинаково работоспособны.
$ ls -l
total 12
-rw-r--r--  1 sergey  sergey  7 Mar 30 08:56 file number 1.txt
-rw-r--r--  1 sergey  sergey  9 Mar 30 08:56 file number 2.txt
-rw-r--r--  1 sergey  sergey 61 Mar 30 13:24 files
$ cat files
tar -czf test.tar.gz "file number 1.txt" "file number 2.txt"
$ eval `cat files`
$ ls -l
total 16
-rw-r--r--  1 sergey  sergey   7 Mar 30 08:56 file number 1.txt
-rw-r--r--  1 sergey  sergey   9 Mar 30 08:56 file number 2.txt
-rw-r--r--  1 sergey  sergey  61 Mar 30 13:24 files
-rw-r--r--  1 sergey  sergey 179 Mar 30 13:27 test.tar.gz
$ tar -zt -f test.tar.gz 
file number 1.txt
file number 2.txt

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

Спасибо. Иду читать маны. Чегото я ещё недоучил.

кстати eval выполняет команду в текущем шеле или сабшеле????

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