Linux文本提取GREP

Linux文本提取GREP,grep,ubuntu-server,teamspeak,Grep,Ubuntu Server,Teamspeak,我正在Ubuntu服务器上运行Teamspeak 3服务器,我想使用脚本获取当前连接的客户端 脚本当前从Teamspeak服务器查询中输出: clid=1 cid=11 client_database_id=161 client_nickname=Music client_type=1|clid=3 cid=11 client_database_id=153 client_nickname=Music\sBot client_type=0|clid=5 cid=1 client_database

我正在Ubuntu服务器上运行Teamspeak 3服务器,我想使用脚本获取当前连接的客户端

脚本当前从Teamspeak服务器查询中输出:

clid=1 cid=11 client_database_id=161 client_nickname=Music client_type=1|clid=3 cid=11 client_database_id=153 client_nickname=Music\sBot client_type=0|clid=5 cid=1 client_database_id=68 client_nickname=Unknown\sfrom\s127.0.0.1:52537 client_type=1|clid=12 cid=11 client_database_id=3 client_nickname=FriendlyMan client_type=0|clid=16 cid=11 client_database_id=161 client_nickname=Windows\s10\sUser client_type=0|clid=20 cid=11 client_database_id=225 client_nickname=3C2J0N47H4N client_type=0
我怎样才能从混乱中提取昵称? 更具体地说,只有那些包含“client_type=0”的

使用GREP(GREP-E-o'client_昵称=\w+'),接近我想要的

client_nickname=Music
client_nickname=Music
client_nickname=Unknown
client_nickname=FriendlyMan
client_nickname=Windows
client_nickname=3C2J0N47H4N
期望输出:

Music Bot,FriendlyMan,Windows 10 User,3C2J0N47H4N

我们的输入由一行组成:

$ cat file
clid=1 cid=11 client_database_id=161 client_nickname=Music client_type=1|clid=3 cid=11 client_database_id=153 client_nickname=Music\sBot client_type=0|clid=5 cid=1 client_database_id=68 client_nickname=Unknown\sfrom\s127.0.0.1:52537 client_type=1|clid=12 cid=11 client_database_id=3 client_nickname=FriendlyMan client_type=0|clid=16 cid=11 client_database_id=161 client_nickname=Windows\s10\sUser client_type=0|clid=20 cid=11 client_database_id=225 client_nickname=3C2J0N47H4N client_type=0
使用grep+sed 以下是一种从grep开始,然后使用sed清理到最终格式的方法:

$ grep -oP '(?<=client_nickname=)[^=]+(?=client_type=0)' file | sed -nE 's/\\s/ /g; H;1h; ${x; s/ *\n/,/g;p}'
Music Bot,FriendlyMan,Windows 10 User,3C2J0N47H4N
awk代码使用
|
作为记录分隔符,awk一次读取一条记录。每个记录被划分为多个字段,字段分隔符为空格或等号。如果记录包含文本
client\u type=0
,则我们将字段8中出现的所有
\s
替换为空格,然后打印结果字段8

使用bash 这将产生以下输出:

Music Bot,FriendlyMan,Windows 10 User,3C2J0N47H4N

我们的输入由一行组成:

$ cat file
clid=1 cid=11 client_database_id=161 client_nickname=Music client_type=1|clid=3 cid=11 client_database_id=153 client_nickname=Music\sBot client_type=0|clid=5 cid=1 client_database_id=68 client_nickname=Unknown\sfrom\s127.0.0.1:52537 client_type=1|clid=12 cid=11 client_database_id=3 client_nickname=FriendlyMan client_type=0|clid=16 cid=11 client_database_id=161 client_nickname=Windows\s10\sUser client_type=0|clid=20 cid=11 client_database_id=225 client_nickname=3C2J0N47H4N client_type=0
使用grep+sed 以下是一种从grep开始,然后使用sed清理到最终格式的方法:

$ grep -oP '(?<=client_nickname=)[^=]+(?=client_type=0)' file | sed -nE 's/\\s/ /g; H;1h; ${x; s/ *\n/,/g;p}'
Music Bot,FriendlyMan,Windows 10 User,3C2J0N47H4N
awk代码使用
|
作为记录分隔符,awk一次读取一条记录。每个记录被划分为多个字段,字段分隔符为空格或等号。如果记录包含文本
client\u type=0
,则我们将字段8中出现的所有
\s
替换为空格,然后打印结果字段8

使用bash 这将产生以下输出:

Music Bot,FriendlyMan,Windows 10 User,3C2J0N47H4N

使用“grep-E-o'client_nickname=\w+”,我几乎可以得到我想要的东西,但是对于名称中带有空格的客户端,这失败了。您想要什么输出?抱歉,我应该提到这一点。我想要一个所有客户端昵称的列表。使用“grep-E-o'client_昵称=\w+”,我几乎可以得到我想要的,但是对于名称中带有空格的客户端,这失败了。您想要什么输出?对不起,我应该提到这一点。我想要一份所有客户昵称的清单。哇,这太复杂了。。。反正对我来说太高级了。它起作用了!我应该开始使用这些文本操纵器了,它们很有用。@CR33P1N3V1L是的,
sed
awk
都很有用。我遇到了awk方法的问题。第一个用户名被替换为“type”。我让那个用户重新登录,它修复了它。当awk出现故障时,我尝试了grep+sed方法,效果很好。暂时使用grep+sed@CR33P1N3V1L我很高兴
grep
+
sed
能为您工作。如果你给我看混淆了
awk
代码的输入,我会看看我能用它做些什么。哇,太复杂了。。。反正对我来说太高级了。它起作用了!我应该开始使用这些文本操纵器了,它们很有用。@CR33P1N3V1L是的,
sed
awk
都很有用。我遇到了awk方法的问题。第一个用户名被替换为“type”。我让那个用户重新登录,它修复了它。当awk出现故障时,我尝试了grep+sed方法,效果很好。暂时使用grep+sed@CR33P1N3V1L我很高兴
grep
+
sed
能为您工作。如果你给我看混淆了
awk
代码的输入,我会看看我能用它做些什么。