Печать обе строки, если столбец изменяется

Безопасность (возможно, за счет большего неудобства администратора, если вы неправильно оцените ситуацию). С моего рабочего стола OpenBSD:

/dev/sd0b none swap sw
/dev/sd0a / ffs rw,softdep 1 1
/dev/sd0k /home ffs rw,nodev,nosuid,softdep 1 2
/dev/sd0d /tmp ffs rw,nodev,nosuid,noexec 1 2
/dev/sd0f /usr ffs rw,nodev 1 2
/dev/sd0g /usr/X11R6 ffs rw,nodev 1 2
/dev/sd0h /usr/local ffs rw,nodev 1 2
/dev/sd0j /usr/obj ffs rw,nodev,nosuid,noatime,async 1 2
/dev/sd0i /usr/src ffs rw,nodev,nosuid,noatime,async 1 2
/dev/sd0e /var ffs rw,nodev,nosuid 1 2

Преимущества: что-то заполняющее / var или / home не вызовет проблем для других разделов. Временные разделы могут иметь noatime и async , установленные для них, для повышения производительности. Разделы, не относящиеся к устройствам, запрещают использование устройств, что может помочь предотвратить создание kmem или другого подобного устройства в несомненно гнусных целях. Кроме того, nosuid в различных случайных файловых системах, чтобы исключить те, которые были созданы, хотя и случайно.

Имея только один массивный раздел, что-то может заполнить весь диск (о, вам нужно было записать в / tmp , чтобы создать этот билет Kerberos для входа в систему? Извините ...), возможно создавать случайные устройства и двоичные файлы suid, и на этом большом разделе невозможно настроить производительность для разных нужд.

Какой стиль имеет смысл, будет зависеть от ОС, сайта, назначения системы, простоты управления и т. Д.

2
13.09.2018, 22:14
3 ответа

С помощью awkвы можете сделать:

awk 'BEGIN  { getline; cmp=$4; preline=$0 }
     cmp!=$4{ print preline, $0 } { cmp=$4; preline=$0 }' OFS='\n'  infile
A 20 30 loss
A 30 40 no
A 60 70 no
A 70 80 gain

В блоке BEGINмы читаем первую строку и сохраняем столбец #4 в переменной с именем cmpи всю строку в preline; позже сравните столбец 4 предыдущей строки с текущей строкой, если были изменения, то выведите как значение preline, так и прочитанную текущую строку $0; следующий блок просто обновляет столбец 4 текущей строки и всю строку снова как предыдущую строку для следующего запуска.

2
27.01.2020, 21:58

Используя редактор sedразновидности GNU, мы можем сделать это следующим образом:

sed -Ee '
    $d;N
    /\s(\S+)\n.*\s\1$/!p
    D
' input.file

Мы постоянно переносим две строки в пространство шаблонов, N, и ищем переход последнего поля. Как только мы обнаруживаем один, /\s(\S+)\n.*\s\1$/!p, мы печатаем все пространство шаблонов. Затем мы удаляем первую часть Dпространства шаблонов в обоих сценариях с переходом или без перехода, поскольку на этом этапе использование первой части заканчивается.

Управление переходит к началу кода sed и, если мы еще не достигли eof, мы повторяем эту процедуру снова и снова. Eof останавливает операцию, $d.

Выход:

A 20 30 loss
A 30 40 no
A 60 70 no
A 70 80 gain
1
27.01.2020, 21:58

Почему бы и нет:

$ awk '(NR > 1) && (LAST !~ $4 "$") {print LAST; print $0} {LAST = $0}' file
A 20 30 loss
A 30 40 no
A 60 70 no
A 70 80 gain
1
27.01.2020, 21:58

Теги

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