1

ユーザーがコンピューターにログオンしたことがあるかどうかを検索する bash スクリプトを実行していますが、以下のこの部分に来て、何をすべきかわかりません。

wtmp ファイル (既にコピーおよび解凍済み) を読み取り、すべての行をユーザーとともに表示するループを作成しました (この部分は機能します)。ただし、ユーザーが見つからない場合、スクリプトは通知する必要がありますが、その方法がわかりません。

ls -1t $folder/wtmp* 2> /dev/null| while read filename ;
do
    last -f "${filename}" 2>/dev/null | grep $user | cut -c 1-7,40-63
done

良いアドバイスをいただければ幸いです、人々:-)

4

2 に答える 2

0

ループを実行する前に、パイプフェイルを使用してください。Pipefail は、コマンド パイプラインで右端のゼロ以外のエラー ステータスを返す bash オプションです。

たとえば、あなたの問題は次のとおりです

last -f file | grep user | cut -c 1-7

 succeeds        fails      succeeds

ただし、デフォルトでは、bash はカット コマンドの終了コードのみをパイプ ラインの終了コードとして使用します ( $? )。

もし、あんたが

set -o pipefail

最初に grep の終了ステータスが代わりに使用されます

そう:

set -o pipefail
ls -1t $folder/wtmp* 2> /dev/null| while read filename ;
do
    last -f "${filename}" 2>/dev/null | grep $user | cut -c 1-7,40-63
    [[ $? -gt 0 ]] && echo "user not found in $filename"
done
set +o pipefail
于 2013-01-22T16:30:57.083 に答える
0

grep要求された正規表現が見つからない場合、ゼロ以外の終了ステータスで終了します。そのため、すべての呼び出しの出力を への 1 回の呼び出しcut、次に への1 回の呼び出しを介して最後にパイプするだけgrepで、一致するものを出力します。行、または何も見つからず、リストの他の部分が実行されます。

for filename in "$folder"/wtmp*; do
  last -f "${filename}"     
done 2> /dev/null | cut -c 1-9,40-63 | grep $user || echo "$user not found"

lsさらに、引数として使用する glob をlsfor ループで直接使用して、ディレクトリ内のファイルを反復処理できるため、を呼び出す必要はありません。

(文字の範囲を調整して、完全な 8 文字のユーザー名と、ユーザー名とタイムスタンプを区切るためのスペースを取得できるようにしました。)

于 2013-01-22T17:08:24.660 に答える