Bash: фильтр файла по последнему слову - PullRequest
0 голосов
/ 15 октября 2018

У меня есть файл журнала, который выглядит следующим образом:

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"

Я пытаюсь отредактировать файл так, чтобы он сохранял 1-е вхождение «пользователя» и удалял остальные.Таким образом, в целом вышеприведенный блок будет выглядеть так:

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 голосов
/ 15 октября 2018

̲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─────────────────────────────┘
0 голосов
/ 15 октября 2018

вам не нужно 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]++ post подсчитывает вхождения последних значений полей, очевидно, будет нулевым дляпервое и ненулевое значение для последующих значений.отрицание (!) этого значения (рассматривается как логическое, 0 ~ ложь; 1 ~ истина) составляет только true для первого экземпляра значения.Действие по умолчанию - {print $0}, поэтому явно не написано.

Это стандартная идиома awk для печати уникальных значений, не требующая сортировки файла.

...