2016-12-03 15 views
1

私はbashスクリプトの世界では初めてです。私は簡単な作業をしようとしています。ログインしているすべてのユーザーと使用しているプロセスを一覧表示しようとしています。Bashスクリプティング、コレクションの情報収集

私は$(who)を行うと、私は以下のようになります。私は、次の手順を実行しようとしています、

このため
user1:console 
user1:ttys010 

user1 console Nov 19 21:08 
user1 ttys010 Nov 28 09:32 

私のような出力何かに私のスクリプトを期待しています。

userlist=$(who) 
for users in $userlist 
do 
    echo $users 
done 

は私が期待していた出力は次のような値であろう$ユーザーだった:私は、このコマンドを実行したときに代わりに

$users[0] : user1 console Nov 19 21:08 (so that I could use 'cut' command to get what I wanted) 

$ユーザーのための真の価値を次のとおりです。

$users[0] = user1 
$users[1] = console 
$users[2] = Nov 

誰かが達成方法を教えてくれたら大変感謝しています。 これは、ログインしているユーザーを取得することではなく、入力とループで作業する方法を学ぶことです。

答えて

1

forループの構文は次のとおりです。

WORDS
for NAME [ [in [WORDS ...] ] ; ] do COMMANDS; done 

$IFS区切られた文字列です。

userlist=$(who)は、whoコマンドの出力をuserlist変数に割り当てます。 $userlist変数が二重引用符で囲まれていない場合は、$IFS文字(特に改行とスペース)で区切られた単語に展開されます。

したがって、次のループは、$userlist文字列内のすべての単語を繰り返します(whoコマンドの出力)。出力の最初の2つのフィールドをキャプチャするために

for word in $userlist; do echo "$word"; done 

、次のようにAWKツールを使用することができます。

who | awk '{print $1 ":" $2}' 

変数$1$2最初とレコード内の第二フィールドを参照してください。 。

レコードは、AWKのRS(レコード区切り文字)built-in variableで指定された文字で区切られています。 RSはデフォルトで1つの改行文字になります。

同様に、FS組み込み変数は、フィールドセパレータを指定します。デフォルト値はスペースです。各行について

userlist=$(who) 
while read user line other; do 
    echo "$user":"$line"; 
done <<< "$userlist" 

whileループとreadを使用

+0

おかげルスラン。これは私に、これらのことがどのように機能するかについての洞察を与えました。スクリプティングの世界に新しいことは、私は本当にこれに感謝します。 –

1

  • userlinewhoコマンドの最初の二つの文字列に設定されている(other変数は残りのためでありますここでは使用されていません)。
  • 変数は:の区切り文字でエコーされます。

それともcutと:詳細な回答や説明のための

who | tr -s ' ' | cut -d' ' -f1,2 --output-delimiter=$':' 
+0

答えをありがとう。今、私の頭の中ではっきりとわかります。 –

関連する問題