#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