Циклическое выполнение команды awk с использованием bash в RHEL

#bash #shell #awk #rhel

#bash #оболочка #awk #rhel

Вопрос:

Я пытаюсь выполнить цикл вывода команды awk в bash. Я сохранил выходные данные в переменную, и когда я выполняю цикл, все выходные данные сохраняются как одна длинная строка, а не как каждый отдельный индекс. Как я смогу использовать каждую отдельную строку? Есть другие предложения? Спасибо!

 variable=`awk -F '$3 > 1000 { print $1 }' < /etc/password | grep -v 'person1|person2'`

for x in "{$variable[@]}";do
chage -M 60 "$x"
 

Комментарии:

1. ваш текущий код выполняет то, что вы просили его сделать, т. Е. Сохраняет Все содержимое awk|grep вызова в виде одной строки в переменной с именем variable ; Я предполагаю, что вы действительно хотите сохранить awk|grep результаты в виде массива значений в массиве с именем variable , и в этом случае вам следует изменить свойкод для variable=( $(awk ... | grep ...) ) ; затем вы можете запустить typeset -p variable , чтобы отобразить содержимое / структуру массива

2. Вы захотите прочитать mywiki. wooledge.org/BashFAQ/001

3. Вам никогда не нужно использовать grep, когда вы используете awk. awk -F: '$3 > 1000 { print $1 }' < /etc/password | grep -v 'person1|person2 может быть записан как всего одна команда awk -F: '($3 > 1000) amp;amp; ($1 !~ /person1|person2/) { print $1 }' < /etc/password

Ответ №1:

На поверхности цель состоит в том, чтобы запускать chage ... любого пользователя с uid> 1000, исключая двух предопределенных пользователей (person1, person2). Небольшое исправление цикла должно решить проблему.

Исправлены две незначительные проблемы: awk использует ‘:’ в качестве разделителя полей, а цикл bash выполняет итерацию по простой переменной (вместо массива). Решение интегрируйте пользовательский фильтр в скрипты awk, устраняя отдельные grep :

 user_list=`awk -F: '$3 > 1000 amp;amp; $1 !~ "$(person1|person2)$" { print $1 }' < /etc/password`

for x in $user_list ; do
    chage -M 60 "$x"
done