【问题标题】:Bash scripting, collecting information in collectionBash 脚本,在集合中收集信息
【发布时间】:2017-04-18 03:08:48
【问题描述】:

我是 bash 脚本世界的新手。我正在尝试做一个简单的任务。试图列出所有登录的用户和他们正在使用的进程。

当我执行$(who) 时,我得到以下信息:

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

我希望我的脚本输出如下内容:

user1:console
user1:ttys010

为此,我正在尝试执行以下操作。

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

我期望的输出是 $users 将具有以下值:

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

当我运行这个命令时,$users 的真正价值是:

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

如果有人能指点我如何实现,将不胜感激。 这不是关于获取登录用户,而是更多关于学习使用输入和循环。

【问题讨论】:

    标签: bash shell for-loop scripting


    【解决方案1】:

    readwhile 循环一起使用:

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

    对于每一行:

    • userline 设置为 who 命令的前两个字符串(other 变量用于该行的其余部分,此处未使用)。
    • 变量以: 分隔符回显。

    或者cut:

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

    【讨论】:

    • 感谢您的回答。我现在非常清楚这是如何工作的。
    【解决方案2】:

    for 循环的语法是:

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

    其中WORDS$IFS 分隔的字符串。

    表达式userlist=$(who)who 命令的输出分配给userlist 变量。如果$userlist 变量没有用双引号括起来,它会扩展为由$IFS 字符(尤其是换行符和空格)分隔的单词。

    因此,下面的循环会迭代$userlist 字符串中的所有单词(who 命令的输出)。

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

    为了捕获输出的前两个字段,可以使用AWK工具如下:

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

    变量$1$2 引用记录中的第一个和第二个字段。

    记录由 AWK 的 RS(记录分隔符)built-in variable 中指定的字符分隔。 RS 默认为单个换行符。

    同样,FS 内置变量指定字段分隔符。它的默认值是空格。

    【讨论】:

    • 感谢 Ruslan 的详细回答和解释。这让我对这些事情是如何工作的有了深入的了解。作为脚本世界的新手,我真的很感激这一点
    猜你喜欢
    • 2016-08-13
    • 2016-05-29
    • 1970-01-01
    • 2015-11-11
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    相关资源
    最近更新 更多