Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: sed, AWK, GREP - удаление строки следующей за искомой  (Прочитано 716 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Vasilliy

  • Автор темы
  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Доброго. Помогите понять.
Вот часть лога:
Fri Oct 8 10:59:09 CONNECTED
Fri Oct 8 11:01:04 DISCONNECTED
Fri Oct 8 11:09:34 CONNECTED
Fri Oct 8 11:34:05 CONNECTED
Fri Oct 8 11:47:05 CONNECTED
Fri Oct 8 12:31:11 DISCONNECTED
Fri Oct 8 12:42:43 CONNECTED
Fri Oct 8 12:47:11 DISCONNECTED

нужно выдумать какое то выражение, удаляющая идущие подряд строки содержащие "CONNECTED" оставив только первую. В данном примере удалится
"Fri Oct 8 11:34:05 CONNECTED
Fri Oct 8 11:47:05 CONNECTED"
Количество таких строк может быть разным. Пробовал зацепиться за DISCONNECTED и удалить перед ним строки.. или наоборот, зацепиться за CONNECTED и удалять уже после него... Но.. но не могу ;D
Скорее всего нужен AWK.

Оффлайн Peter_I

  • Старожил
  • *
  • Сообщений: 2566
    • Просмотр профиля
Если этот лог в ввиде файла, то я не вижу, в чём тут трудность. Читать его построчно и в случае встречи строки с CONNeCTED
не перезаписывать идущие подяд за ней строки с CONNECTED. Для этого достаточно средств самого bash.
Пётр.

Оффлайн ALiEN175

  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 5373
  • Сделай шаг и пройдешь милю
    • Просмотр профиля
uniq -f4
ASUS P5K-C :: Intel Xeon E5450 @ 3.00GHz :: 8 GB DDR2 :: Radeon R7 260X :: XFCE
ACER 5750G :: Intel Core i5-2450M @ 2.50GHz :: 6 GB DDR3 :: GeForce GT 630M :: XFCE

Оффлайн qpdb

  • Активист
  • *
  • Сообщений: 405
  • xUbuntu 20.04
    • Просмотр профиля
Приветствую!
Скорее всего нужен AWK.

Я часто вот это предлагаю, проверено временем 😇:
awk -i inplace '!($0 in a) {a[$0];print}' FILE.txt
Сортирует „на месте” без изменения порядка строк т.е. дубликаты удаляются. Если файл очень большой, то не мгновенно, а зависит от возможностей компьютера😞 …

2021 Oct 16; 10:31 AM

Пользователь добавил сообщение 16 Октября 2021, 19:23:40:
Нет, пожалуй это не подойдёт, разве что в комплексе с чем-то…  :idiot2:

Ведь результат должен быть таким, если я правильно понимаю :
Fri Oct 8 10:59:09 CONNECTED
Fri Oct 8 11:01:04 DISCONNECTED
Fri Oct 8 11:09:34 CONNECTED
Fri Oct 8 12:31:11 DISCONNECTED
Fri Oct 8 12:42:43 CONNECTED
Fri Oct 8 12:47:11 DISCONNECTED

2021 Oct 16; 12:23 PM

Пользователь добавил сообщение 16 Октября 2021, 23:42:08:
Приветствую ещё раз!
Так как задача интересная, то я попытался её решить хотя бы примитивно, потому как основные интеллектуальные силы нашего форума устали😇, оно и понятно каждодневное наблюдение лени и махровой бестолковщины утомляет.😞

Метод называется „читаю и перевожу со словарём” т.е. читаю файлы помощи ❰man❱ и пытаюсь составлять команды.

(Нажмите, чтобы показать/скрыть)

Не осилил до конца переменные в awk, потому преобразовал данные:
sed -i "/\ CONNECTED/s@^@One1 @;/DISCONNECTED/s@^@Two2 @" TEST.txt

(Нажмите, чтобы показать/скрыть)

Тогда после команд:
awk -i inplace '$1=="One1"{l=$0;next}l{print l; l=""}1' TEST.txt
awk -i inplace '$1=="Two2"{l=$0;next}l{print l; l=""}1' TEST.txt

Получаем:
One1 Fri Oct 8 10:59:09 CONNECTED
Two2 Fri Oct 8 11:01:07 DISCONNECTED
One1 Fri Oct 8 11:47:05 CONNECTED
Two2 Fri Oct 8 12:31:11 DISCONNECTED
One1 Fri Oct 8 12:42:46 CONNECTED
Two2 Fri Oct 8 12:47:12 DISCONNECTED
One1 Fri Oct 8 10:59:09 CONNECTED
Two2 Fri Oct 8 11:01:04 DISCONNECTED
One1 Fri Oct 8 11:47:05 CONNECTED
Two2 Fri Oct 8 12:31:11 DISCONNECTED
One1 Fri Oct 8 12:42:43 CONNECTED
Two2 Fri Oct 8 12:47:11 DISCONNECTED
One1 Fri Oct 8 10:59:09 CONNECTED
Two2 Fri Oct 8 11:01:04 DISCONNECTED
One1 Fri Oct 8 11:47:05 CONNECTED
Two2 Fri Oct 8 12:31:11 DISCONNECTED
One1 Fri Oct 8 12:42:43 CONNECTED

Не успеваю решить вопрос как оставлять первую строку, а не последнюю… Но это детали, принцип я думаю понятен Two2 и One1 тоже понятно как убирать.

Я понимаю как это всё жутко, но на большее у меня ума не хватает  :'(

2021 Oct 16; 04:42 PM
« Последнее редактирование: 16 Октября 2021, 23:42:08 от qpdb »

Оффлайн archuser

  • Активист
  • *
  • Сообщений: 681
    • Просмотр профиля
Решение в лоб:
first_matching=true
while read -r line; do
    connected=$(echo "${line}" | grep "\bCONNECTED")
    if [ -z "${connected}" ]; then
        first_matching=true
        continue
    fi
    if [ $first_matching == true ]; then
        echo $line
        first_matching=false
    fi
done < log.txt

 

Страница сгенерирована за 0.018 секунд. Запросов: 21.