Bash 如何使用pinky只显示用户的名字而不是显示所有信息?
任何想法都很好,谢谢!我试图在网上搜索,但找不到任何有用的建议,另外,我如何检查输入是否可以找到,我现在的输入是否有效 您可以为此使用Bash 如何使用pinky只显示用户的名字而不是显示所有信息?,bash,Bash,任何想法都很好,谢谢!我试图在网上搜索,但找不到任何有用的建议,另外,我如何检查输入是否可以找到,我现在的输入是否有效 您可以为此使用awk。我不知道你的$1参数代表什么。如果让我猜的话,那就是登录名。下面是小指的一些示例输出: 登录名TTY Idle在何处 fbar Foo Bar pts/0 00:26 2020-02-05 09:32 10.0.0.2 bbaz Bar Baz pts/1 00:03 2020-01-27 10:41 10.0.0.3 假设$1代表一个登录名,则应使用以
awk
。我不知道你的$1
参数代表什么。如果让我猜的话,那就是登录名。下面是小指的一些示例输出:
登录名TTY Idle在何处
fbar Foo Bar pts/0 00:26 2020-02-05 09:32 10.0.0.2
bbaz Bar Baz pts/1 00:03 2020-01-27 10:41 10.0.0.3
假设$1代表一个登录名,则应使用以下选项:
#if argument passed in cannot be found among sessions logged in
function fname(){
result=$(pinky "$1")
if [ ! -f "$result" ] then
FNAME="NOTFOUND"
return 0
else
FNAME="$(pinky -f -h)"
return 0
fi
}
说明:
awk的-F
选项定义字段分隔符并支持正则表达式。因此,我们将分隔符定义为“至少1个空格”,因为pinky的输出类似于列类型格式,其中每个字段之间可能有多个空格。将其用作字段分隔符,用户fbar的字段值如下所示:
$1:fbar
$2:Foo
$3:酒吧
$4:pts/0
... 其他的我们都不在乎。我们得到了名字字段($2)
实际的awk代码部分是“\$1==\”$login\u name\“{print\$2}”
。通常,最好对awk代码使用单引号,以避免所有转义,但我想包含一个bash变量,所以我使用了双引号
“\$1==\“$login\u name\”
该\$1
正在引用输入中的第一个字段。我们在字符串比较中将其与bash变量$login\u name
进行比较。我们可以将bash变量保留为$1
,但这会使比较更加混乱(将\$1
与$1
进行比较)。如果比较结果为真,我们将运行下一位代码:{print\$2}
这将打印我们的名字字段
注意:如果用户使用多个会话登录,您将获得多行输出。如果不需要这样做,您也可以在第一次匹配时退出awk程序:
login_name=$1
pinky | awk -F '[ ]+' "\$1 == \"$login_name\" {print \$2}"
另一种可能更简洁的方法是使用awk的-v
(变量赋值)选项来避免bash变量和转义字符:
pinky | awk -F '[ ]+' "\$1 == \"$login_name\" {print \$2; exit}"
编辑:
awk
的默认字段分隔符实际上是[:空格:]+
这与我定义的很接近,但包含了其他类似空格的选项卡。这使得上面的-F选项多余,可以忽略。参数代表什么?用户名?谢谢!我输入的是用户名,我使用pinky-F(usrname)| awk'{print$2}实现了相同的效果“!!谢谢你的提示!@Yangziki哦,是的,这更干净了。你也教了我一些新东西。awk的默认分隔符与我定义的非常接近,使得字段分隔符定义多余。
pinky | awk -v login="$1" -F '[ ]+' '$1 == login {print $2; exit}'