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
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
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
É permitido usar dois processos grep
? Se sim, tente:
grep -oE '^([^:]+:){3}[^:]+' /etc/passwd | grep -oE '[^:]+$'
É 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.