我有一个应用程序的日志文件,我必须仅过滤未成功登录的用户(在用户 ID 之后注册为 ok)
日志文件具有如下条目。
user2
user5
user7
user1
user1
user1 ok
user8
user9
user3
user3 ok
预期输出应如下所示。
user2
user5
user7
user8
user9
我想:
sed "/user/N;/ok/d"
没有结果。我一直收到“用户 1”
user2
user5
user7
user1
user8
user9
答案1
这是有效的,除非我以错误的方式理解你的问题:
$ grep -v -f <(grep " ok$" aa.txt |cut -d' ' -f1) aa.txt
user2
user5
user7
user8
user9
实际上,我们在文件中查找所有标记为“正常”的名称,然后我们使用这些名称作为从同一文件中排除的模式,以获得“不正常”登录。
这是基于以下事实:由于 user1 最终成功登录(即使经过三次尝试),因此 user1 不会被视为失败,因此排除了所有 user1 尝试。
grep -v :排除模式
grep -f :从文件加载模式,这里是保存成功登录的进程替换。
PS1:文件 aa.txt 是我的本地文件之一,我已将您的数据粘贴到其中。
更新:在 ok 之前
使用<(grep " ok$" aa.txt |cut ...)
空格,将确保登录失败但名称中包含“ok”的用户名不会被匹配(即用户 Bangok)