Показать дубликаты GID в / etc / passwd с помощью awk - PullRequest
1 голос
/ 17 октября 2019

Привет, мне нужно сделать следующее: разработать программу на AWK, которая читает / etc / passwd и печатает имена тех пользователей, которые имеют одинаковый GID, в форме GID name1 name2.

Я просматривал этот поств stackoverflow пытается разработать решение: awk + Как найти дубликаты в столбце?

Решение там вроде работало, но было неполным и не было правильно отформатировано.

Я нашел этот код в Интернете, но не могу запустить его:

awk -F: '{print $4}' /etc/passwd | sort | uniq -d > output.txt
awk -F: {kount[$4]++}
END{for {$1 in kount[$4]}}
printf("%d %s", $4, $1) output.txt

Очевидно, что у него есть некоторые проблемы с синтаксисом при смешивании кода bash и awk. Я разделил его на две программы: скрипт bash и скрипт awk. Bash один работает правильно, он содержит:

awk -F: '{print $4}' /etc/passwd | sort | uniq -d > output.txt

Эта программа работает правильно и дает мне файл output.txt, который содержит номера 65534 и 7. Это правильно.

Затем я попытался написатьпрограмма awk для обработки этого файла, и она выглядит так:

BEGIN{ 
    FS=":" 
} 
    {a[$4]++} 

END{ 
    for {$1 in a[$4]}  
    {printf "%d %s", $4, $1}
}

, и это не работает. Я чувствую, что я действительно близко, но не могу найти решение, любая помощь будет высоко ценится! Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Если вы не привязаны к awk и можете использовать решение для чистого bash, которое не требует вложенных оболочек:

#!/bin/bash

while IFS=: read name pw uid gid remain; do
  [ "${gid}" != "" ] && groups[${gid}]+="${name} "
done < /etc/passwd

for gid in ${!groups[@]}; do
  echo "${gid}: ${groups[${gid}]}"
done

Пример вывода:

0: root sync shutdown halt operator 
1: bin 
2: daemon 
4: adm 
7: lp 
...
0 голосов
/ 17 октября 2019

Не могли бы вы попробовать следующее.

awk -F':' '{a[$4]=(a[$4]?a[$4] OFS:"")$1;b[$4]++} END{for(i in a){if(b[i]>1){print i,a[i]}}}' Input_file

Это даст gid, а затем всем пользователям в строке с одинаковым значением gid, не проверенным.

Объяснение: Добавление пояснения к приведенному выше коду.

awk -F':' '                           ##Starting awk program here and setting field separator as colon here.
{
  a[$4]=(a[$4]?a[$4] OFS:"")$1        ##Creating an array named a whose index is $4 and its value is $1 which will be keep concatenating itself on each occurrence.
}
END{
  for(i in a){                        ##Starting a for loop to traverse through all items of array a here.
    print i,a[i]                      ##Printing index is array a current element along with its value.
  }                                   ##Closing for loop BLOCK here.
}
' Input_file                          ##Mentioning Input_file name here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...