在bash中使用awk来过滤输入

时间:2017-03-21 17:48:16

标签: bash awk filter

我想在服务器控制台中使用/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

如果只有一名玩家在线并且没有,,则问题可能是过滤它。

3 个答案:

答案 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

这将:

  1. 用冒号和空格 <your command> | awk -F": " 'NR==2{split($2,a,", "); for(x in a) print a[x]}'
  2. 拆分记录
  3. 如果我们在第二行/记录-F": "
  4. 然后用逗号和空格分隔第二个字段(您的名字列表)并将其存储在名为&#34; a&#34;:NR==2
  5. 的数组中
  6. 最后迭代数组,将每个元素分配给&#34; x&#34;并打印元素:split($2,a,", ")
  7. for(x in a) print a[x]中执行此操作可能更为优雅,但这是一个良好的开端,当您的服务器上只有一个用户时,它可以解决您的问题。

答案 2 :(得分:0)

您可以像这样使用awk

awk -F ']: ' '/players online/{getline; gsub(/, */, ORS, $2); print $2}' output.log

Tester1212
Me99666