2016-07-17 6 views
1

私は、スクリプトの引数でユーザ名をチェックし、関連する行を/ etc/passwdファイルと/ etc/groupファイルから出力するbashスクリプトで作業しようとしています(/ etc /シャドーファイル)。現在、私はif then elseループを利用して/ etc/*ディレクトリの内容をチェックし、関連する情報を出力しています。私の意図は、一致するユーザーが2つのファイルに見つからない場合には単純なテキスト行を出力することであり、したがってNULL値です。しかし、それは私が探しているもののために完全に間違っている情報を出力しています。BASHへの新しいユーザーとして、そしてLinuxは一般的です、私はすぐにいくつかの目障りな問題があると確信しています。しかし、私は学びたいと思っています。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。ユーザー名が見つかった場合は、すべての行を出力したいところです。 見つかったところですが、ユーザー名が見つからなかった場合は、 に返信します。

これは、ユーザ名が両方/etc/passwd & /etc/groupに最初に表示される私達はちょうど:表示され先頭にものを一致させるためにはgrepで^を配置し、伝統などの簡単な

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

することができユーザー名の後ろに。

ランが

./script 'username' 
としてスクリプト
+0

''^$ 1: "'それ以外の場合は、 './script foo'を呼び出すときに' foobar'というユーザを得ることができます。 –

+0

ありがとうございます。これは、最初のユーザー名の値を返します。しかし、私は、入力されたユーザー名を含むすべての行を返そうとしています。したがって、grepを利用するための私の最初の推論です。 – NewBashUser226

+0

@ NewBashUser226:アップデート –

0

停止、あなたはこのすべて間違って考えています。

UNIXシェルは、これらの呼び出しを順序付けるための言語を持つ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で