Как вставить строку между последовательными повторяющимися строками?

Не уверен, что это то, что вам нужно, но время начала и прошедшее время можно найти с помощью команды ps.

ps -o 'comm,stime,etime' 1134 #1134 is your pid

Конечно, применяются и другие параметры для ps, например, параметр -aдля отображения не только процессов пользователя

5
08.06.2021, 00:15
3 ответа

awk:

awk 'p==$0{print "     Address : NOT_FOUND"}{p=$0}1'

Довольно наивное решение.

  • p==$0IF p == текущая строка
    • ТОГДА распечататьnot found
  • p=$0SET p = текущая строка
  • 1:печать

Обрабатывает последовательные повторяющиеся строки.


И, как заметил @san -fran в комментариях под вопросом, «Последний IP-адрес тоже может отсутствовать, верно?» – Упс. Должен был подумать об этом.

Так:

awk -v e='Address : NOT_FOUND' 'p==$0{print e}{p=$0}END{if($1 ~ "IP")print e}1'
  • Установить e= текст для ввода
  • p==$0IF p == текущая строка
    • THEN напечатать переменнуюe
  • p=$0SET p = текущая строка
  • ENDвывести e, если текущая строка содержитIP
  • 1:печать

Здесь ошибка -строка добавлена ​​как переменная, поскольку мы используем ее дважды. (И обрезано для удобства чтения в этом посте ).

13
28.07.2021, 11:26

Это один из способов сделать это с помощью скользящего -окна в GNU sed:

parse.sed

# Handle last-line-error
$ { /IP/ s/$/\n   Address : NOT_FOUND/; }

# Always keep 2 lines in pattern-space
N

# If the lines are identical
/^([^\n]*)\n\1$/ { 

  # Add error text
  s/\n/\n   Address : NOT_FOUND\n/

  # Ensure we still only have 2 lines in pattern-space
  P
  s/[^\n]*\n//
}

# Print line 1 and delete it from pattern-space
P
D

Вот модифицированный текст теста -с тройной ошибкой -и последней -строкой -ошибка:

IP_Remote_Address
   Address : 192.168.1.1
IP_Remote_Address
   Address : 192.168.1.2
IP_Remote_Address
   Address : 192.168.1.3
IP_Remote_Address
IP_Remote_Address
IP_Remote_Address
IP_Remote_Address
   Address : 192.168.1.4
IP_Remote_Address
   Address : 192.168.1.5
IP_Remote_Address
   Address : 192.168.1.6
IP_Remote_Address
   Address : 192.168.1.7
IP_Remote_Address
IP_Remote_Address
   Address : 192.168.1.8
IP_Remote_Address

Запустите это так:

sed -Ef parse.sed infile

Или в виде одного -вкладыша:

<infile sed -E '${/IP/ s/$/\n   Address : NOT_FOUND/};N;/^([^\n]*)\n\1$/{s/\n/\n   Address : NOT_FOUND\n/;P;s/[^\n]*\n//};P;D'

Выход в обоих случаях:

IP_Remote_Address
   Address : 192.168.1.1
IP_Remote_Address
   Address : 192.168.1.2
IP_Remote_Address
   Address : 192.168.1.3
IP_Remote_Address
   Address : NOT_FOUND
IP_Remote_Address
   Address : NOT_FOUND
IP_Remote_Address
   Address : NOT_FOUND
IP_Remote_Address
   Address : 192.168.1.4
IP_Remote_Address
   Address : 192.168.1.5
IP_Remote_Address
   Address : 192.168.1.6
IP_Remote_Address
   Address : 192.168.1.7
IP_Remote_Address
   Address : NOT_FOUND
IP_Remote_Address
   Address : 192.168.1.8
IP_Remote_Address
   Address : NOT_FOUND
6
28.07.2021, 11:26

Использование GNU-версии утилиты редактирования потоков sed в расширенном режиме регулярных выражений:

sed -Ee '
  x;1d;G
  ${/\n\s*IP_/ba;}
  /^(.*)\n\1$/{
    g;:a;p;c\
   Address : NOT_FOUND
    b
  }
  $!s/\n.*//
' file
  • текущая строка помещается в пространство для хранения, а предыдущая строка — в пространство шаблона.
  • когда есть совпадение между удержанием и пространством шаблона (то есть предыдущая строка и текущая строка )мы печатаем строку + не найденную строку.
  • последняя строка - /IP _/ затем также добавляем не найденную строку.
4
28.07.2021, 11:26

Теги

Похожие вопросы