【问题标题】:Is there a way to combine the outputs of two bash commands?有没有办法组合两个 bash 命令的输出?
【发布时间】:2019-02-15 18:40:07
【问题描述】:

我正在努力显示用户的显示名称、登录日期和时间,以及他们的默认 Bash shell。我可以让每一个都打印,但我找不到让它逐行显示的方法。

这是我到目前为止所尝试的。我曾尝试使用该管道,但到目前为止,将它们都放入变量中是最接近的方法。

#!/bin/bash

x="$(who | tr -s [:space:] | cut -d' ' -f1,3,4)"
y="$(cat /etc/passwd | tr -s [:print:] | cut -d':' -f7)"


echo $x  $y

我必须为每个用户显示这个:

username date of login time of login default bash shell

更新: 其他问题的答案将单个字符串组合在一起,这个问题是询问如何将 WHO 命令的多行与用户默认的 bash shell(同样是多行)组合起来。这就是我在这里问的原因。

我的示例输出是显示用户名、登录时间和登录日期,以及每个登录用户的默认 bash shell,就像 who 命令所做的那样(所以基本上我想使用 who 命令,删掉什么我想退出它,然后将用户的默认 bash shell 添加到末尾)。我有两个命令给我,但我需要将默认的 bash shell 添加到“who”命令显示的每个用户上。现在程序会打印出所有登录的用户,然后在打印完所有用户后,它会打印默认的 shell。

【问题讨论】:

  • 请在您的问题中添加示例输入和该示例输入所需的输出。
  • 您能否详细说明“我找不到让它逐行显示”的意思?
  • 你不能期望两个脚本的输出会神奇地对齐。
  • 如果可以,答案是paste。这可能是一个足够常见的第一个练习,我们应该能够找到重复项。

标签: bash


【解决方案1】:

这是一个快速而肮脏的尝试。

who |
while read -r name _ time date _; do
    printf "%-12s %-14s %-14s %s\n" \
        "$name" "$time" "$date" \
        "$(getent passwd "$name" | cut -d: -f7)"
done

我在猜测字段是什么以及列的宽度是多少; who 工具的输出非常依赖于系统。

【讨论】:

  • 我明白这是在做什么,但是当它运行时,它不会在输出的任何地方显示默认的 bash。这是我被困最久的部分。不过,所有字段和列宽都很棒。
  • 糟糕,我打错了变量名。现在更新了。对于那个很抱歉。 (我没有getent,所以我愚蠢地没有测试那部分。)
  • 我不明白你为什么称它为“默认bash”;每个用户都定义了一个 shell(当然是“默认 shell”),我们单独查找它们;它很可能不是 Bash。
  • 那是因为。我自己应该注意到这一点,但这完美地显示了它。我可能会弄乱一些格式以及我可以用它做什么,但这正是我想要做的。感谢您的帮助理解。
  • 没问题,在 Bash 的奇妙世界中度过一个美好的周末。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-24
  • 2014-01-19
  • 1970-01-01
  • 1970-01-01
  • 2017-04-09
  • 2011-10-14
相关资源
最近更新 更多