LINUX.ORG.RU

uniq не работает на несортированных данных.

Тут нужен awk:

awk '$0 in X { print; } { X[$0]=1; }'

Это оставит только все повторы строк. Если повторений более двух, то надо инвертировать условие в авк и подать на него текст, развёрнутый tac

legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 2)
Ответ на: комментарий от Nervous

Тогда в конце окажется старый мусор, который мне нафиг не нужен.

steemandlinux ★★★★★
() автор топика
Ответ на: комментарий от steemandlinux

лол как grep`ом можно чистить bash_history?

Например так:

for i in $(history | grep "rm -rf /*" | awk '{print $1}'); do history -d $i; done

Удалит все «rm -rf /*» из истории, кроме факта самого удаления. А чтоб скрыть и этот факт, команду (точнее набор команд) надо начинать с пробела.

А откуда, если не секрет, команды такие в истории? Проверял, удалится ли корень от обычного юзверя или вводил что не попадя из Сети? :-)

aureliano15 ★★
()

Добавь export HISTCONTROL=ignoredups в ~/.bashrc и хотя бы такого:

cd /
cd /
уже не будет.

ashot ★★★★
()
Последнее исправление: ashot (всего исправлений: 1)

Для небольших текстов, типа bash_history можно так:

#!/bin/awk -f
BEGIN { n=0 }
{ X[$0]=n++; }
END { for(i=0;i<n;i++) for(t in X) if(X[t]==i) print t }
даст:
cd /
exit
rm -rf /*

vodz ★★★★★
()
Ответ на: комментарий от steemandlinux

Теперь работает как часы... китайские.

Ну, электронные китайские часы не намного хуже механических швейцарских. А японские так даже лучше. :-)

aureliano15 ★★
()

Вообще, я не очень понял, чего ты хочешь. Но я когда-то задавался вопросом чистки истории.

Короче, если из твоего примера нужно получить такое:

cd /
exit
rm -rf /*
то есть убрать все повторы начиная с конца, то вот, держи фильтр:
| tac | nl -w10 | sort -k2 -s | uniq -f1 | sort -nk1 | cut -sf2- | tac

anonymous
()

Вот тебе мой однострочник скрипт велосипед на perl, который читает с stdin (или с файлов аргументов CLI) и оставляет только последнее вхождение дупликата печатая вывод на stdout:

#!/usr/bin/env perl

use strict;
use warnings;

my $ln = 0;
my %lines = map { $_ => ++$ln } <>;
print sort { $lines{$a} <=> $lines{$b} } keys %lines;

KennyMinigun ★★★★★
()
Ответ на: комментарий от KennyMinigun

Пример выполнения:

$ cat test.txt 
rm -rf /*
cd /
cd /
exit
rm -rf /*

$ cat test.txt | ./last_uniq.pl 
cd /
exit
rm -rf /*

$ ./last_uniq.pl test.txt 
cd /
exit
rm -rf /*

KennyMinigun ★★★★★
()

tac sample.txt | awk '!a[$0]++' | tac

cat sample.txt hello1 hello2 hello3 hello1

tac sample.txt | awk '!a[$0]++' | tac hello2 hello3 hello1

serbathome
()

Стесняюсь спросить: это ты решил оставить прощальный подарочек любимой работе?

slamd64 ★★★★★
()
Ответ на: комментарий от steemandlinux

На шару написал, у меня вся история kill-ryzen'ом засрана.

А как связан ryzen и засирание истории баша? Аж интересно стало.

Deleted
()
Ответ на: комментарий от slamd64

Это у меня два процессора и на обоих валится gcc при компиляции. Весь bash_history был забит одной и той же командой.

steemandlinux ★★★★★
() автор топика
Последнее исправление: steemandlinux (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.