Безопасность (возможно, за счет большего неудобства администратора, если вы неправильно оцените ситуацию). С моего рабочего стола 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, и на этом большом разделе невозможно настроить производительность для разных нужд.
Какой стиль имеет смысл, будет зависеть от ОС, сайта, назначения системы, простоты управления и т. Д.
С помощью 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 текущей строки и всю строку снова как предыдущую строку для следующего запуска.
Используя редактор 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
Почему бы и нет:
$ 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