我想在服务器控制台中使用/list
检查我的Minecraft服务器上的在线玩家。这给了我以下输入。目标是比较玩家是否在特定列表中。如果他不是,我们踢他。在output.log
中列出了允许的玩家(每一行)。
mc()
{
screen -S mcserver -p 0 -X stuff "$1^M"
}
if ! grep -q $player output.log; then
echo "$player do not runs launcher."
mc "kick $player"
我们想为玩家过滤以下输入以获取在线玩家,然后可以检查是否有允许列表:
[18:43:08] [pool-2-thread-528/INFO]: There are 2/100 players online.
[18:43:08] [pool-2-thread-528/INFO]: Tester1212, Me99666
背后的想法是使用awk过滤输入,并通过观察,
或类似内容来查找输入。
最终输出应该是(每一行):
Tester1212
Me99666
如果只有一名玩家在线并且没有,
,则问题可能是过滤它。
答案 0 :(得分:2)
试试这个 -
awk -F'[, ]' '/players online/ {getline; print $3RS$5}' f
Tester1212
Me99666
OR
awk -F'[, ]' '/players online/ {getline; print $3,$5}' f
Tester1212 Me99666
答案 1 :(得分:0)
如果这是来自Minecraft服务器上的$OUT_VALS
,那么您所追踪的记录将始终是第二个。这在这里很有帮助。
您可以使用awk来解析这样的行:
/list
这将:
<your command> | awk -F": " 'NR==2{split($2,a,", "); for(x in a) print a[x]}'
-F": "
NR==2
split($2,a,", ")
在for(x in a) print a[x]
中执行此操作可能更为优雅,但这是一个良好的开端,当您的服务器上只有一个用户时,它可以解决您的问题。
答案 2 :(得分:0)
您可以像这样使用awk
:
awk -F ']: ' '/players online/{getline; gsub(/, */, ORS, $2); print $2}' output.log
Tester1212
Me99666