/etc/passwd 파일을 처리하여 홈 폴더가 /home에 있는 모든 사용자를 나열합니다.

/etc/passwd 파일을 처리하여 홈 폴더가 /home에 있는 모든 사용자를 나열합니다.

다음과 같은 샘플 /etc/passwd 파일이 있습니다.

tom:x:1000:1000:Work:/home/tom:/bin/bash
george:x:1000:1000:Work:/home/george:/bin/bash
bla:x:1000:1000:Work:/home/bla:/bin/bash
boo:x:1000:1000:Work:/home/boo:/bin/bash
bee:x:1000:1000:Work:/root/list:/bin/bash

홈 폴더가 있는 모든 사용자를 나열하려고 합니다 /home/.

나는 썼다

cat ~/Desktop/e.txt |awk -F ":" '{if ($6 ~/^/home/) print $1;}'

e.txt는 여기에 복사한 텍스트입니다.

백슬래시를 이스케이프 문자로 사용하는 데 문제가 있다는 것을 알고 있지만 명령의 한 줄에 나열할 수 있도록 어떻게 수정합니까?

답변1

/이스케이프를 방지하려면 정규식 대신 따옴표를 사용할 수 있습니다 /.

awk -F: '$6 ~ "^/home/" {print $1}' ~/Desktop/e.txt

이를 통해 awk종종 {if (foo) ... }just 로 단순화할 수 있습니다 foo {...}.

답변2

다음과 같이 슬래시를 피할 수 있습니다.

awk -F':' '$6~/^\/home\//{ print $1 }' ~/Desktop/e.txt

다른장난복잡한 필드 구분 기호가 사용됩니다.

awk -F'[:/]' '$7=="home"{ print $1 }' ~/Desktop/e.txt
  • -F'[:/]'- 및 필드 구분 기호 :로 모두 처리/

답변3

e.txt라고 가정하면 사용자 계정 정보가 LDAP 등에서 지정한 여러 위치 에 저장될 수 있으므로 실제로 구문 분석 파일 대신 /etc/passwd사용해야 합니다 .getent passwd/etc/nsswitch.conf

getent passwd | awk -F ':' '$6 ~ "^/home"'

print조건이 참일 때 이 명령문은 암시적으로 적용됩니다. 그러나 이렇게 하면 전체 줄이 인쇄됩니다. 그러면 사용자 이름만 인쇄됩니다.

getent passwd | awk -F ':' '$6 ~ "^/home" {print $1}'

답변4

index예를 들어 grep -F반환 값을 사용하여 문자열의 시작과 일치하는지 확인하는 등 고정 문자열 일치 에 사용할 수도 있습니다.

$ awk -F: 'index($6,"/home/")==1{print $1}' ip.txt
tom
george
bla
boo

또는 정규식이 필요한 경우 환경 변수로 전달하세요.

$ r='^/home/' awk -F: '$6 ~ ENVIRON["r"]{print $1}' ip.txt
tom
george
bla
boo

관련 정보