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


10

다음과 같은 예제 / 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는 여기에 복사 한 텍스트입니다.

이스케이프 문자 인 백 슬래시에 문제가 있음을 이해하지만 한 줄의 명령으로 나열 할 수 있도록 어떻게 수정합니까?


11
답변 외에 일반적인 조언 (사이 잠시만으로오고있다!) : 그것은하지 않습니다 거의 절대 감각 cat및 파이프 등의 도구 awksed나처럼 그들이 인수로 파일 이름을 부여 할 수있다.
Philippos

1
고양이 e.txt | grep 홈 | cut -d ":"
Arpit Agarwal

3
모든 사용자가 1000의 UID를 가지기 때문에 약간 까다로울 수 있습니다.
StrongBad

1
@ArpitAgarwal grep home e.txt | cut -d ":" -f 1. UUOC 상을 축하합니다. 그러나 이것은 좋은 해결책이 아닙니다. 데몬의 이름을 따서 명명 된 별도의 사용자로 실행되는 서비스 "홈 백업"이있는 경우 어떻게합니까? 그것은 거짓 긍정입니다.
NieDzejkob

2
@Philippos re "파일 이름을 인수로 지정할 수있는 도구에 고양이와 파이프를 연결하는 것은 거의 의미가 없습니다."-일반적으로 cat > tool왼쪽에서 오른쪽 흐름을 유지하여 선명도를 향상시킬 수 있기 때문에 이러한 명령 줄의 변형을 사용합니다. 파이프 체인의 입력 처리 출력. 그것은 이다 하지만 거의 항상 최소한 때문에, 덜 효율적. 또한 (바로 교체 관련 및 유용한 대화 형으로 매우 분명 실행 진행률 표시 줄을 추가하게 cat하여 pv그 설치된 경우).
David Spillett

답변:


11

아래와 같이 슬래시를 피할 수 있습니다.

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

또 다른 트릭 은 복잡한 필드 구분 기호를 사용하는 것입니다.

awk -F'[:/]' '$7=="home"{ print $1 }' ~/Desktop/e.txt
  • -F'[:/]'- 치료 둘 :/필드 분리 될

2
주석 필드 (홈 디렉토리 직전)에는 슬래시가 포함될 수 있다고 생각합니다.

12

/이스케이프를 피하기 위해 정규 표현식 대신 따옴표를 사용할 수 있습니다 /.

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

awk, {if (foo) ... }종종 단지로 단순화 할 수있다 foo {...}.


8

가정은 e.txt실제로 /etc/passwd당신이 실제로 사용해야 getent passwd하는 대신 사용자 계정 정보에 지정된 여러 위치에 저장 될 수 있기 때문에 파일을 구문 분석의 /etc/nsswitch.confLDAP 등.

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

합니다 print조건에 해당하는 경우 문을 암시한다. 그래도 전체 줄이 인쇄됩니다. 사용자 이름 만 인쇄합니다.

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

4

awk를 좋아하지 않는 사람들을위한 대안 :

grep -E '^([^:]*:){5}/home/' ~/Desktop/e.txt | cut -d: -f1

설명:

  • grep -E 확장 된 정규 표현식 기능을 사용할 수 있습니다.
  • 표현식 ([^:]*:)은 다음 ':'구분 기호를 포함하여 하나의 열과 일치합니다.
  • ^([^:]*:){5} 각 줄의 처음 다섯 열과 일치
  • ^([^:]*:){5}/home/ 6 번째 열이 '/ home /'로 시작하는 모든 줄과 일치
  • cut -d: -f1:열 구분자로 사용하여 입력의 첫 번째 열만 선택합니다.

3

또한 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

3

다양성을 위해서

$ perl -F: -lane 'print $F[0] if m(/home/)' e.txt
tom
george
bla
boo

설명

-F:     use ":" as field separator  
-lane
    l   add newline line-ending to every print statement
    a   auto-split input lines into @F array
    n   apply expression line by line to named file (or STDIN)
    e   evaluate perl commands given on command line

print $F[0]   print (only) the first field of each line
if m(/home/)  but only if the line contains the text /home/

어디에서 /home/발견 되는지 까다로운 변형

perl -F: -lane 'print $F[0] if $F[5] =~ m(^/home/)' e.txt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.