다음과 같은 샘플 /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