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.