2016-07-17 4 views
1

스크립트의 인수에서 사용자 이름을 확인한 다음/etc/passwd 및/etc/group 파일 (/ etc/passwd 파일이 아닌)에서 관련 행을 출력하는 bash 스크립트를 작성하려고합니다. 그림자 파일). 현재, if then else 루프를 사용하여/etc/* 디렉토리의 내용을 확인하고 관련 정보를 출력합니다. 내 의도는 일치하는 사용자가 두 파일에 없으면 null 텍스트 값을 출력하는 것이 었습니다. 그러나, 내가 찾고있는 정보에 대해 완전히 잘못된 정보를 출력하고 있습니다. BASH의 새로운 사용자로서, 그리고 리눅스는 일반적이지만, 당장 눈부신 문제가있을 것이라고 확신합니다. 그러나 나는 배우려고 노력하고 있습니다.BASH grep 스크립트

내 스크립트 코드 또는 올바른 방향의 요령에 대한 도움이 있으면 정말 감사합니다. 고맙습니다.

#! /bin/bash                


USERLOOK='grep -h $USERID ~/etc/* | grep :x:'      

grep $1 ~/etc/*              
if [ -z $1 ]; then               
    echo "User not found."            
else                  
    echo "$USERLOOK"             
fi                   
exit 0 
+0

질문이 명확하지 않습니까? './script user_to_check'라고하는 스크립트에 사용자 이름을 인자로 입력하고 싶습니까? – sjsam

+0

[인용하기] (http://mywiki.wooledge.org/BashGuide/Practices#Quoting) 및 [명령 대체] (http://mywiki.wooledge.org/CommandSubstitution)를 읽어야합니다. –

+0

@sjsam 네, 스크립트 입력 기능을 사용하고 싶습니다 ./script user_to_check. 사용자 이름이 발견되면 grep 사용에 대한 나의 추측이었던 모든 행을 출력하고 싶습니다. 그러나 사용자 이름을 찾을 수 없다면, 나는 그것을 반향시키고 싶습니다. – NewBashUser226

답변

2

/etc/passwd 또는 입력 된 사용자 이름을 포함 /etc/group의 모든 라인을 찾습니다 :

#!/bin/bash 

USERLOOK=$(grep -h "$1" /etc/passwd /etc/group) 

if [ -z "$1" ] || [ -z "${USERLOOK}" ]; then 
    echo "User not found." 
else 
    echo "$USERLOOK" 
fi 
+0

': x :'는'/ etc/shadow'에 대해 작동하지 않으며, 어쨌든 당신은 줄의 시작 부분에 검색을 앵커해야합니다.'^ $ 1 : "" –

+0

레거시 백틱을'$()'로 바꿀 수도 있습니다. –

+0

응답 해 주셔서 감사합니다. 이것은 분명히 내가 처음에 가지고있는 것이 더 잘 작동하지만, 스크립트 인수에 입력 된 사용자 이름을 포함하는 두 파일 모두에서 모든 행을 반환하려고했습니다. 또한이 스크립트를 기반으로 작성한 구문 오류가 있으므로 감사합니다. – NewBashUser226

1

내가 스크립트 기능을 갖고 싶어 어디 입력 user_to_check ./script. 사용자 이름이 발견되면 모든 행을 출력하고 싶습니다. 발견 된 곳 ... 그러나 사용자 이름을 찾을 수 없다면 에 그 내용을 표시하고 싶습니다.

: 바로 나타납니다 간단

#!/bin/bash 
grep "^${1}:" /etc/passwd /etc/group 
[ $? -ne 0 ] && echo "User : ${1} not found" 

사용자 이름이 우리가 처음에 물건을 일치하도록 그렙에와 전통에 의해 ^을 배치 모두 /etc/passwd & /etc/group에서 초기에 나타나는

그것은이 될 수 사용자 이름 다음에.

실행 중지, 당신은 잘못이 모든에 대해 생각하고

./script 'username' 
+0

''^ $ 1 : "'다른 것을 사용하면'./script foo'를 호출 할 때'foobar' 사용자를 얻을 수 있습니다. –

+0

응답 해 주셔서 감사합니다. 이렇게하면 첫 번째 사용자 이름 값이 반환됩니다. 그러나, 입력 된 사용자 이름을 포함하는 모든 줄을 반환하려고합니다. 따라서 grep 활용에 대한 나의 초기 추론. – NewBashUser226

+0

@ NewBashUser226 : 업데이트 정보 –

0

으로 스크립트.

UNIX 셸은 UNIX 도구를 호출하여 해당 호출을 순서대로 지정하는 환경입니다. 텍스트를 조작하는 범용 유닉스 툴은 awk이다. 따라서 파일에서 텍스트를 찾고 무엇인가를 할 수있는 제어 로직이 필요하다면 그것은 쉘 스크립트가 아닌 awk 스크립트 여야합니다.

awk -v user="$1" ' 
$0 ~ user { line = $0 } 
END { print (line != "" ? line : "User not found") } 
' /etc/passwd /etc/group 

을하지만 그건 일반적으로 얼마나 어려운 달리, 각 파일에 대해, 하나 개의 필드에, 심지어 다른 필드를 검색을 집중 AWK와 사소한 참고 : 쉘 역할은 다음과 같이 AWK, 뭔가를 호출하는 것입니다 grep.