grep
의 그룹 ID 만 포함하고 싶습니다 /etc/passwd
. 이제 이름을 찾는 방법을 알아냈습니다.
grep -oE '^[^:]+' /etc/passwd
이것은 나에게 다음을 제공합니다:
[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
:
처음 세 개를 생략 하고 일치를 시작하도록 이 정규식을 어떻게 변경합니까 [^:]+
? ( ^
줄의 시작 부분과 일치하기 때문에 이름을 추출할 수 있고 콜론 3개 이후의 위치와 일치하는 것을 원합니다.)
PS 하나가지다사용grep
답변1
이는불가능한표준과 마찬가지로 grep
주어진 grep
패턴과 일치하는 전체 행이 항상 반환됩니다. GNU는 가능 grep
하지만 다른 많은 유형의 Unices에 이식할 수 없고 유지 관리(또는 더 흥미로운 작업을 수행하기 위해 수정)가 어렵고 이해하기 어렵습니다.
사용이 더 쉬워졌습니다 awk
:
getent passwd | awk -F ':' '{ print $4 }'
이렇게 하면 passwd
데이터를 가져오고 네 번째 :
로 구분된 필드가 추출됩니다.
또는 더 간단하게 다음을 사용하십시오 cut
.
getent passwd | cut -d ':' -f 4
awk
1000보다 작은 UID의 GID만 가져오는 등 더 흥미로운 처리를 수행할 수 있지만 :
getent passwd | awk -F ':' '$3 < 1000 { print $4 }'
:
출력에서 세 번째로 구분된 열을 구문 분석하도록 선택할 수도 있으며 getent group
, 이는 중복 항목을 제공하지 않는다는 추가 이점이 있습니다.
getent group | cut -d ':' -f 3
답변2
GNU grep(Linux의 기본 명령)을 사용하는 경우 -P
옵션 및 예측 어설션을 사용하여 이를 수행할 수 있습니다.
grep -Po '[0-9]+(?=(?::[^:]*){3}$)' /etc/passwd
답변3
두 가지 프로세스가 허용됩니까 grep
? 그렇다면 다음을 시도해 보십시오.
grep -oE '^([^:]+:){3}[^:]+' /etc/passwd | grep -oE '[^:]+$'
답변4
pcregrep
일반 대신 허용됩니까 grep
? 그렇다면 이렇게 하면 됩니다
pcregrep -o2 '^([^:]+:){3}([^:]+)' /etc/passwd
pcregrep
-o
그룹화된 하위 문자열과 일치하도록 옵션 기능을 확장합니다 . 위 명령에 대한 정규식에서는 파일 필드가 [^:]+:
일치하므로 passwd
처음 ^([^:]+:){3}
세 필드(사용자 이름, 비밀번호 필드 및 UID)가 일치합니다. 아래는 ([^:]+)
정규 표현식의 두 번째 그룹으로, 네 번째 필드인 GID와 일치합니다. 이 -o2
플래그는 pcregrep
두 번째 그룹만 출력됨을 나타냅니다.