Grep apenas gids de / etc / passwd [closed]

0

Eu quero grep apenas IDs de grupo de /etc/passwd . Agora eu só vim a gritar os nomes, com:

grep -oE '^[^:]+' /etc/passwd

que me dá:

[frynio@manjaro ~]$ grep -oE '^[^:]+' /etc/passwd
root
nobody
dbus
bin
daemon
mail
ftp
http
systemd-journal-remote
systemd-coredump
uuidd
dnsmasq
rpc
usbmux
avahi
colord
cups
deluge
git
lightdm
nm-openconnect
nm-openvpn
ntp
polkitd
frynio

Como posso alterar esse regex, omitir os três primeiros : s e, em seguida, começar a corresponder com [^:]+ ? (pq o ^ antes de coincidir com o começo da linha, é por isso que eu posso extrair os nomes, e eu quero que algo combine com a posição depois de 2 vírgulas).

PS I tem para usar grep

    
por minecraftplayer1234 28.10.2018 / 21:51

4 respostas

2

Se você estiver usando o GNU grep (que é o padrão no linux), você pode fazê-lo com a opção -P , e uma afirmação antecipada:

grep -Po '[0-9]+(?=(?::[^:]*){3}$)' /etc/passwd
    
por 28.10.2018 / 23:38
4

Observe que isso é impossível para fazer com o padrão grep , pois grep sempre retornará uma linha completa correspondente ao padrão fornecido. Seria possível com o GNU grep , mas seria não-portável para muitos outros tipos de Unices, difíceis de manter (ou de modificar para fazer coisas mais interessantes) e não-triviais de entender.

Mais fácil com awk :

getent passwd | awk -F ':' '{ print $4 }'

Isso obtém os dados passwd e extrai o quarto campo : -delimited.

Ou ainda mais fácil com cut :

getent passwd | cut -d ':' -f 4

embora com awk você possa fazer um processamento mais interessante, como apenas obter o GID para UIDs abaixo de 1000:

getent passwd | awk -F ':' '$3 < 1000 { print $4 }'

Também é possível optar por analisar a terceira coluna : -delimited da saída de getent group , o que teria o benefício adicional de não fornecer duplicatas.

getent group | cut -d ':' -f 3
    
por 28.10.2018 / 22:13
1

É permitido usar dois processos grep ? Se sim, tente:

grep -oE '^([^:]+:){3}[^:]+' /etc/passwd | grep -oE '[^:]+$'
    
por 28.10.2018 / 22:55
0

É permitido usar pcregrep em vez de grep normal? Se sim, você pode fazer

pcregrep -o2 '^([^:]+:){3}([^:]+)' /etc/passwd

pcregrep estende a funcionalidade da opção -o para deixar corresponder uma subcadeia agrupada. Na expressão regular no comando acima, [^:]+: corresponde a um campo de arquivo passwd , então ^([^:]+:){3} corresponde aos três primeiros campos (nome de usuário, campo de senha e UID). O seguinte ([^:]+) , que é o segundo grupo na regex, corresponde ao quarto campo, que é GID. O -o2 sinalizador informa pcregrep para produzir apenas esse segundo grupo.

    
por 28.10.2018 / 23:30

Tags