2012-04-04 3 views
5

У меня есть теоретический вопрос:AWK - Передача переменной с getline в систему()?

1) Как передать переменную системе getline()?

awk 'BEGIN{var="ls"; var | getline var; system("echo $var")}' 

2) Как назначить переменную систему вывода («ls») и распечатать результат в awk?

awk 'BEGIN{var="system("ls")"; print '$var'}' 

3) Вы можете назначить переменную в системе (Var = "LS") и распечатать результат в AWK?

awk 'BEGIN{system(var="ls"); print "'"$var"'"}' 

Благодарим за информацию.

EDIT:

Торек: Спасибо за ваш ответ.

Я понимаю, что в первом примере, вы можете сделать это:

awk 'BEGIN { while ("ls -l" | getline var) system("echo " var );}' 

Для этого приложения, вы не можете назначить переменный выход из системы()? Как и в этом примере:

awk 'BEGIN {var="ls -l"; system(var); print var}' 

ответ

12

Вы считаете, что это неправильно, я думаю. Awk-х system просто принимает любую старую строку, чтобы дать ему одну, например .:

system("echo " var); # see side note below 

(помните, что в AWK, строки соединяются по смежности). Кроме того, system выполняет только команду; чтобы захватить его выход, вам нужно использовать getline, аналогично вашему вопросу №1.

Если вы хотите, чтобы прочитать все выходные ls вам нужно цикла по результату от getline:

awk 'BEGIN { while ("ls" | getline var) print "I got: " var; }' 

Поскольку это определяет только BEGIN действие, awk запустится, запустите ls, собирать каждый выход и распечатайте его, а затем выйдите.


Side Примечание: будьте очень осторожно с переменными, переданным в оболочку (это включает в себя как звонки на system и элементы на левой стороне | getline, а также некоторые другие случаи в современных сортах awk -anything, выполняющие команда). Backquotes, $(command), и точки с запятой могут позволить пользователям вызывать произвольные команды. Например, в приведенном выше примере system("echo " var), если var содержит ; rm -rf $HOME, команда становится echo ; rm -rf $HOME, что почти наверняка не то, что вы хотите.

Вы можете проверить «плохие» символы или объект, или указать их. Современные 8-битные чистые оболочки должны требовать только цитирования цитат (для синтаксической действительности), $, <, >, | и `. Если вы используете одиночные кавычки для цитирования аргументов (чтобы они отображались как одно слово), вам нужно только избежать одиночных кавычек.См. this unix.stackexchange.com answer для получения более подробной информации.


одна сторона примечания: я, как правило, добавить «лишнюю» точку с запятой для моих AWK скриптов, делая их более похожие C синтаксический. Старая привычка лет назад.

+0

torek: Благодарим за отзыв. Для этого приложения вы не можете назначить переменную output из system()? Как в этом примере: 'awk 'BEGIN {var =" ls -l "; Система (вар); print var} '' – Tedee12345

+0

Функция' system': (1) запускает что-то до завершения; то (2) возвращает свое значение выхода. Значение 'ls' имеет значение 0 при успешном завершении. Итак, вы можете сделать 'x = system (foo); print "ran" foo "и получил" x; ", например. Если 'foo' - это строка' 'ls'', это будет запускать' ls', а выход будет выводиться на stdout awk и установить 'x' в 0, потому что' ls' преуспеет. – torek

+0

Благодарим за отзыв. – Tedee12345

Смежные вопросы