2011-03-04 2 views
1

이것은 시작 bash 클래스의 숙제 문제의 일부입니다. passwd 파일을 가져와야합니다.이 파일은 passfile 변수로 처리 했으므로 특정 파일을 추출하고 다른 필드를 표시 할 수 있어야합니다. 아래의 명령문을 사용하여 CLI에서 수동으로 grep하면 제대로 작동합니다. 나는 모든 변수를 원하고 모든 것을 얻는다.If 문에서 grep을 사용하여 공백을 무시하고 모든 항목을 가져옵니다.

grep 1000 passfile | cut -c1- 

그러나 스크립트에서이 작업을 수행하면 사용자 전체 이름의 첫 번째 '공백'에서 중지되거나 중단됩니다. John D. Doe는 내가 원할 때 3 줄을 반환 할 것입니다. 나는 i와 다음의 가치를 반향하여 이것을 보았다. 저를 제공

i = jdoe:x:123:1000:John 

가 :

for i in `grep 1000 ${passfile} | cut -c1- 

user=`echo $1 | cut -d : -f1` 
userID=`echo $1 | cut -d : -f3` 

예를 들어, 선이

jdoe:x:123:1000:John D Doe:/home/jdoe:/bin/bash 

나는 다음과 같은 얻을 읽는 경우, 이용자가 jdoe입니다 UID가 509

하지만, 그 다음 줄에서 저는 R에서 시작합니다.
i , UID는 = R. 그래서 사용자가 R.이며, UID는 R.

다음 라인 사용자는 존슨 반환

i = Johnson:/home/jjohnson:/bin/bash 

이다 passwd 파일이 많은 사용자를 너무 보유

/빈/bash는 I for 루프를 사용하여 모두 처리해야합니다. 나는 내가 그것을 얻을 수있는 공간을 무시하도록 할 수 있다면 그렇게 생각합니다. 그러나 리눅스에 대해 많은 것을 알지 못한다면 올바른 경로로 내려갈 지 확신 할 수 없습니다. 사전에 도와 주셔서 감사합니다.

답변

1

기본적으로 cut은 콜론이 아닌 공백으로 나뉩니다. 계속 사용하려면 구분 기호를 지정하십시오.

당신은 아마의 값을 얻기 위해 while 루프 IFS=:read 문을 사용하려면 :

while IFS=: read user password uid gid comment home shell 
do 
    ...whatever... 
done < /etc/passwd 

아니면 while 루프로 파이프 grep의 출력을 할 수 있습니다.

+0

'cut '은'-d' 구분 기호 옵션을 허용합니다. – knittl

+0

@knittl : 예 - 입력 및 출력에 동일한 구분 기호를 사용합니다. 경우에 따라 입력에서 i- 구분 기호를 처리하고 출력에서 ​​o- 구분 기호를 생성하는 것이 편리 할 수 ​​있습니다. AFAIK, 그렇지 않습니다.당신은 또한 분야에서 공백의 문제에 직면합니다. –

0

외부 프로그램을 사용할 수 있습니까? 그렇다면, 나는 작업에 적합한 도구 AWK awk

UID=1000 
awkcmd="\$4==\"$UID\" {print \"user:\",\$1}" 
cat $PASSWORDFILE | awk -F ":" "$awkcmd" 
+0

왜 awkcmd와 같은 변수를 만들 필요가 있습니까? 그리고 고양이는 필요 없습니다. 다음은 awk의 한 줄입니다 : awk -vuid = $ UID '$ 4 == uid {print "user :"$ 1}'file' – kurumi

+0

보다 이해하기 쉽습니다. 나는 생각한다. OP가 awk에 대해 더 잘 알고있을 때, 그는 멋진 한 줄짜리 :-)를 할 수 있습니다. – pepoluan

0

같은 passwd 파일과 같은 특정 필드 구분 기호와 구조 파일을 구문 분석이다 권하고 싶습니다.

UID=1000 
awk -vuid="$UID" '$4==uid{print "user: "$1}' /etc/passwd 

grep이나 cut 또는 다른 것을 사용할 필요가 없습니다. 물론, 읽기 루프가 실행되는 동안 순수한 bash를 사용할 수도 있습니다.

관련 문제