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


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

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

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

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

Оффлайн hitomy

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

где тут awk?

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: как в awk передать внешнюю переменную?
« Ответ #3 : 23 Декабря 2014, 16:44:40 »
А проще обойтись без awk
Вы определитесь, если Вы строите while read-конструкцию, то awk и не нужен вовсе, а так awk сам по себе читает по строкам, ему эта вся конструкция и не нужна:
Код: (bash) [Выделить]
#!/bin/bash
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) [Выделить]
#!/bin/bash
awk -v tree="$2" -F":" '{$3 ~ tree}' "$1"
точно. главный вопрос был про подстановку переменных. спасибо.

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6017
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: как в awk передать внешнюю переменную?
« Ответ #5 : 23 Декабря 2014, 20:53:10 »
Скрипт можно ещё и такой
Код: (awk) [Выделить]
#!/usr/bin/awk -f
BEGIN { FS=":"
FILENAME=ARGV[1]
three=ARGV[2]
ARGV[2]=""
}
$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

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

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

 

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