Bash:按姓氏过滤文件

时间:2018-10-15 19:12:30

标签: bash awk uniq

我有一个看起来像这样的日志文件:

Sun Oct 14 03:38:28 2018 [pid 5922] command: Client "0.0.0.0", "USER macly"
Sun Oct 14 03:38:58 2018 [pid 5940] command: Client "0.0.0.0", "USER tredred"
Sun Oct 14 03:40:41 2018 [pid 6870] command: Client "0.0.0.0", "USER sweet"
Sun Oct 14 03:40:47 2018 [pid 7037] command: Client "0.0.0.0", "USER sweet"

我正在尝试编辑文件,以使其保留“用户”的第一次出现并删除其余的。所以基本上上面的代码块看起来像:

Sun Oct 14 03:38:28 2018 [pid 5922] command: Client "0.0.0.0", "USER macly"
    Sun Oct 14 03:38:58 2018 [pid 5940] command: Client "0.0.0.0", "USER tredred"
    Sun Oct 14 03:40:41 2018 [pid 6870] command: Client "0.0.0.0", "USER sweet"

由于时间戳不同,这些行真的“独特”。我可以使用awk然后再做uniq的想法: awk '{print $NF}' /home/user_logs | uniq

但这只是我每一行的最后一个单词,而不是整行。我需要在命令中添加什么以保持整行?

2 个答案:

答案 0 :(得分:2)

您不需要uniq

$ awk -F, '!a[$NF]++' file

Sun Oct 14 03:38:28 2018 [pid 5922] command: Client "0.0.0.0", "USER macly"
Sun Oct 14 03:38:58 2018 [pid 5940] command: Client "0.0.0.0", "USER tredred"
Sun Oct 14 03:40:41 2018 [pid 6870] command: Client "0.0.0.0", "USER sweet"

说明

a[$NF]++会计算最后一个字段值的出现次数,第一个字段值显然为零,​​随后的值显然为非零。对于值的第一个实例,此值的否定(!)(视为逻辑,0〜false; 1〜true)仅为true。默认操作为{print $0},因此未明确编写。

这是标准的awk习惯用法,用于打印不需要对文件进行排序的唯一值。

答案 1 :(得分:0)

̲I̲f̲数据是固定宽度的,可以使用uniq

$ uniq -s 63 file
Sun Oct 14 03:38:28 2018 [pid 5922] command: Client "0.0.0.0", "USER macly"
Sun Oct 14 03:38:58 2018 [pid 5940] command: Client "0.0.0.0", "USER tredred"
Sun Oct 14 03:40:41 2018 [pid 6870] command: Client "0.0.0.0", "USER sweet"
└──────────────────────────────63─────────────────────────────┘