LINUX.ORG.RU

[awk] Манипуляции-инициализации-махинации с переменными shell

 


0

1

Потянуло меня что-то на бесконечные оптимизации...
Вопрос в принципе простой, как это (инициализацию нескольких переменных по разным критериям)

var1=$(awk '/searchstring1/{print $2}' <<<${content})
var2=$(awk '/searchstring2/{print $3}' <<<${content})
реализовать одиночным вызовом awk?

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

Он фанат zsh, а у них руки чешутся ещё улучшить, ещё, ещё, а-а-а ... Das ist fantastisch!

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

отличное начало, осталось прилепить разные критерии, про которые собственно и был вопрос

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

Тогда, например, так:

awk '/searchstring1/{A=$2}/searchstring2/{B=$3}END{system("tcpdump ..."A"..."B"...")}' <<<${content}

Хотя это ничуть не лучше решения выше в плане защиты от спецсимволов в переменных.

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

Вот она рыба моей мечты, спасибо, sdio!
Вот можите же, если захочите.
Именно такой конструкции мне не хватало в моих супероптимизированных shell скриптах

В благодарность я согласен не выбивать из тебя признание в том, что сначала ты не дочитал условия задачи.
Но молиться на POSIX всё равно не начну.

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

Спасибо за вариант, и проведению среди меня просветительской работы по awk, но ситуация на деле сложнее (запуск нескольких экземпляров tcpdump на удалённом хосте,
первая переменная как раз и определит нужный хост), поэтому в сегодняшнем конкурсе побеждает композиция sdio «eval и его друзья»

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

Все я дочитал, но думал ты awk знаешь и поймешь идею сгенерировать строку с командами шела и скормить ее eval'у , поэтому и написал только костяк.

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

атлична-атлична, мы на половине пути к утиранию носа фанатам POSIX
Но пока не всё работает как надо

% content=$(echo -e "1 2 3\n4 5 6")                                                                                                                                      
% awk '/1/{print $2}/4/{print $3}' <<<${content}
2
6                                                                                 
% awk '/1/{print $2}/4/{print $3}' <<<${content} | read v1 v2
% echo $v1                                                                                                                                                                           
2
% echo $v2 

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

awk '/1/{print $2}/4/{print $3}' <<<${content}

Кхм... ограничение на пробельный символ ведь не зря упоминалось). Вывод должен быть в одну строку. Можно printf, можно awk -v ORS=" "

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

ок, заработало.
Моя теория про ненужность eval подтвердилась в очередной раз.
Спасибо тебе, добрый человек

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

Моя теория про ненужность eval

Как все запущено, однако. Я надеюсь, ты просто еще молод и глуп, но не туп. Иначе печально.

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

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

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