AWK - как вывести список пользователей в Linux

Разбираясь с темой создания пользователей в Linux, и практикуясь на разных придуманных мною примерах, наткнулся сегодня на такую штуку как AWK. Все началось с того, что решил я вывести всех обычных пользователей в системе. Зная, что UID обычных пользователей как правило начинается с 1000 (по крайней мере у меня в Ubuntu так) решил сделать так:

1
2
3
4
5
6
$ cat /etc/passwd | grep :10[0-9][0-9]:
igor:x:1000:1000:igor,,,:/home/igor:/bin/bash
test:x:1001:1001:testuser,1,,:/home/test:/bin/bash
test1:x:1002:1003:,,,:/home/test1:/bin/bash
user1:x:1003:1004:,,,:/home/user1:/bin/bash
user:x:1004:1005:,,,:/home/user:/bin/bash

Вроде как получил то, что требовалось, но захотелось чего-то большего и решил посмотреть как можно вытащить только имена пользователей. Когда-то наталкивался на такую команду как cut, почитал в справке о ней пару пробных примеров и получилось следующее:

1
2
3
4
5
6
$ cat /etc/passwd | grep :10[0-9][0-9]: | cut -d: -f1
igor
test
test1
user1
user

“Как-то громоздко” - подумал я :) Решил посмотреть как люди делают и наткнулся на вот такой пример:

1
2
3
4
5
6
7
$ awk -F: '{if ($3>=1000) print $1}' /etc/passwd
nobody
igor
test
test1
user1
user

Пример был без пояснений, но как-то без особого труда догадался, что эта штука (awk) умеет работать со строками с разделителями. -F: - скорее всего задает этот разделитель, $1 - это номер первого поля, а $3 - третьего. Изменил строку на такую:

1
2
3
4
5
6
7
$ awk -F: '{if ($3>=1000) print $1,"Домашняя папка:",$6}' /etc/passwd
nobody      Домашняя папка: /nonexistent
igor      Домашняя папка: /home/igor
test      Домашняя папка: /home/test
test1      Домашняя папка: /home/test1
user1      Домашняя папка: /home/user1
user      Домашняя папка: /home/user

и убедился в правильности своих догадок.

Затем немного почитав, узнал, что awk - это средство предназначенное для обработки текста, но с большим количеством хорошо проработанных функций, которые позволяют писать о нем как о языке программирования. В общем нужно будет подробнее почитать о нем, так как он идет по умолчанию с дистрибутивами Linux. По man awk выдает неплохую справку. Почитав справку, добавил в условие еще параметр, чтобы избавится от пользователя nobody у которого номер 65534:

1
2
3
4
5
6
$ awk -F: '{if ($3>=1000 && $3<20000) print $1,"Домашняя папка:",$6}' /etc/passwd
igor Домашняя папка: /home/igor
test Домашняя папка: /home/test
test1 Домашняя папка: /home/test1
user1 Домашняя папка: /home/user1
user Домашняя папка: /home/user

Буду стараться еще читать. В Linux много файлов подобных passwd. Так, что думаю будет полезно расширить свои знания по awk.

Статьи и новости схожей тематики:

Один комментарий

  1. IgorKa - Информационный ресурс » Пример скрипта bash:

    [...] Строка 26 - PID=”$(ps ax | grep “/usr/sbin/[s]howtime” | awk ‘{ print $1 }’)” - команда получает PID запущенного процесса /usr/sbin/showtime, который затем будет использован для команды kill (строка 30). О команде awk я упоминал здесь. [...]

Оставьте свой отзыв