2

次の行をkshで機能させることができます

for user in $( awk -F: '{ print $1}' /etc/passwd); do last $user | head -1 ; done | tr -s "\n" |sort

しかし、UNIX sh および UNIX csh で動作するようにしたいと考えています。(Linux sh では正常に動作しますが、Linux は unix ではありません...)

各 UNIX(*) には構文に独自のバリエーションがあるように見えるので、これには制限があることはわかっています。

更新: 申し訳ありませんが、ここにはいくつかの制限があります:

  1. ディスクに書き込めないので、スクリプトを保存できません。
  2. これをCSHでどのように書くのですか?
4

4 に答える 4

3

これはあなたのためにトリックを行うかもしれません.POSIXに準拠している必要があります:

last | awk 'FNR==NR{split($0,f,/:/);a[f[1]];next}($1 in a)&&++b[$1]==1' /etc/passwd - |  sort
于 2013-04-15T19:49:48.003 に答える
1

これには本当にAwkは必要ありません。

while IFS=: read user _; do
    last "$user" | head -n 1
done </etc/passwd  # | grep .

Cshで再発明する代わりに、どうですか

sh -c 'while IFS=: read user _; do last "$user" | head -n 1; done </etc/passwd'

wtmpがローテーションされてからログインしていないユーザーについては、空の出力が得られます。たぶん、| grep .それらを取り除くために a を追加します。(上記でコメントアウトしたものを追加しました。)

繰り返しIFS=:ますが、シェルの内部フィールドセパレーターをコロンに設定するreadと、パスワードファイルが分割されます。

于 2013-04-15T20:26:08.990 に答える