Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: как в awk передать внешнюю переменную?  (Прочитано 1661 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн hitomy

  • Автор темы
  • Участник
  • *
  • Сообщений: 189
    • Просмотр профиля
есть скрипт:
#!/bin/bash
cat $1|while read line; do
echo $line|awk -v tree="$2" -F : '{if($3 ~/$tree/) print $0}'
#sleep 2
done

который в файле /etc/passwd будет искать строку в которой в 3 поле стоит число передаваемое с помощью второго аргумента $2. Как мне запихать значение переменной $2 в awk? Скрипт выше не работает.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5626
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: как в awk передать внешнюю переменную?
« Ответ #1 : 23 Декабрь 2014, 00:46:58 »
В скрипте не надо ставить знак «$» перед переменной
Код: Bash
  1. echo $line | awk -v tree="$2" '$3 ~ tree'
И почему не «==», а «~»?
А проще обойтись без awk
Код: Bash
  1. #!/bin/bash
  2. while IFS=":" read word1 word2 word3 end_line
  3. do
  4.   [[ "$word3" =~ "$2" ]] && echo "$word1:$word2:$word3:$end_line"
  5. done < "$1"
« Последнее редактирование: 23 Декабрь 2014, 16:43:28 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн hitomy

  • Автор темы
  • Участник
  • *
  • Сообщений: 189
    • Просмотр профиля
Re: как в awk передать внешнюю переменную?
« Ответ #2 : 23 Декабрь 2014, 00:50:27 »
Код: Bash
  1. #!/bin/bash
  2. while read word1 word2 word3 end_line
  3. do
  4.   [[ "$word3" =~ "$2" ]] && echo "$word1 $word2 $word3 $end_line"
  5. done < "$1"

где тут awk?

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5626
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: как в awk передать внешнюю переменную?
« Ответ #3 : 23 Декабрь 2014, 16:44:40 »
А проще обойтись без awk
Вы определитесь, если Вы строите while read-конструкцию, то awk и не нужен вовсе, а так awk сам по себе читает по строкам, ему эта вся конструкция и не нужна:
Код: Bash
  1. #!/bin/bash
  2. awk -v tree="$2" -F":" '$3 ~ tree' "$1"
« Последнее редактирование: 23 Декабрь 2014, 21:03:24 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн hitomy

  • Автор темы
  • Участник
  • *
  • Сообщений: 189
    • Просмотр профиля
Re: как в awk передать внешнюю переменную?
« Ответ #4 : 23 Декабрь 2014, 20:50:06 »
А проще обойтись без awk
Вы определитесь, если Вы строите while read-конструкцию, то awk и не нужен вовсе, а так awk сам по себе читает по строкам, ему эта вся конструкция и не нужна:
Код: Bash
  1. #!/bin/bash
  2. awk -v tree="$2" -F":" '{$3 ~ tree}' "$1"
точно. главный вопрос был про подстановку переменных. спасибо.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5626
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: как в awk передать внешнюю переменную?
« Ответ #5 : 23 Декабрь 2014, 20:53:10 »
Скрипт можно ещё и такой
Код: awk
  1. #!/usr/bin/awk -f
  2. BEGIN { FS=":"
  3. FILENAME=ARGV[1]
  4. three=ARGV[2]
  5. ARGV[2]=""
  6. }
  7. $3 == three
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн hitomy

  • Автор темы
  • Участник
  • *
  • Сообщений: 189
    • Просмотр профиля
Re: как в awk передать внешнюю переменную?
« Ответ #6 : 23 Декабрь 2014, 20:53:44 »
Кстати, не работает. :) первая ваша строка.
awk -v tree="$2" -F":" '{$3 ~ tree}' "$1"
« Последнее редактирование: 23 Декабрь 2014, 20:56:42 от hitomy »

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 5626
  • elementaryOS 0.4 Loki, i3wm on Debian9
    • Просмотр профиля
Re: как в awk передать внешнюю переменную?
« Ответ #7 : 23 Декабрь 2014, 20:57:28 »
Поправил:
Код: Bash
  1. #!/bin/bash
  2. awk -v tree="$2" -F":" '$3 ~ tree' "$1"

Если Вы заметили я предлагаю поменять «подмножество»( ~ ) на строгое равенство ( == ). Потому как с "~" если Вы не передадите второй аргумент, то скрипт выведет все строки. Или надо ставить дополнительную проверку на наличие аргумента.
« Последнее редактирование: 23 Декабрь 2014, 21:12:11 от Azure »
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

 

Страница сгенерирована за 0.088 секунд. Запросов: 24.