Удаление строк между 2 строками в Solaris

[114128]Ответ, данный @slm, очень исчерпывающий, но я думаю, что более простое объяснение может появиться в перспективе.

В повседневном использовании мы можем думать о файлах как о физических вещах, т.е. о кусочках данных, хранящихся на каком-то устройстве. Это делает такие файлы как /proc/cpuinfo очень загадочными и запутанными. Однако, все это имеет смысл, если мы думаем о файлах как о интерфейсе [114484][114485]; способе передачи данных внутри и снаружи некоторой программы.

Программы, которые посылают и получают данные таким образом, являются файловыми системами или драйверами (в зависимости от того, как вы определяете эти термины, они могут быть слишком широкими или слишком узкими определениями). Важным моментом является то, что [114486]некоторые [114487] из этих программ используют аппаратное устройство для хранения и получения данных, посылаемых через этот интерфейс; но не все.

Interval Since Last Panic Report:  472 sec
Panics Since Last Report:          2
Anonymous UUID:                    D89B5624-FF95-48B5-8F55-0987EA2D2466

Sun Jun 26 18:02:46 2011
panic(cpu 0 caller 0x6e085e4a): "ntfs_map_runlist_nolock(): Called for $MFT/$DATA!\n"@/SourceCache/ntfs/ntfs-65.5/kext/ntfs_attr.c:245
Backtrace (CPU 0), Frame : Return Address (4 potential args on stack)
 ...
  Kernel Extensions in backtrace (with dependencies):
     com.apple.filesystems.ntfs(3.4)@0x6e05a000->0x6e0b9fff

BSD process name corresponding to current thread: mount_ntfs

Некоторые примеры файловых систем, которые [114488]не[114489] используют устройство для хранения данных (по крайней мере напрямую) являются:

Файловые системы, использующие просмотренные или вычисленные данные. Примером является Proc, так как он получает данные из различных модулей ядра. Экстремальным примером является πfs ( github.com/philipl/pifs )

Все файловые системы FUSE, которые обрабатывают данные с помощью обычной программы пользовательского пространства

Файловые системы, которые преобразуют данные другой файловой системы "на лету", например, используя шифрование, сжатие или даже аудиокодирование ( khenriks.github.io/mp3fs/ )

Операционная система Plan9 ( [114496]http://en.wikipedia.org/wiki/Plan_9_from_Bell_Labs[114497] ) является экстремальным примером использования файлов в качестве общего программного интерфейса.[114139].

2
04.06.2015, 02:23
3 ответа
 $ awk '!f{print} /----------------------/{f=!f;if (!f)print "Deleted up to this point"}' foo.txt
----------------------------------------------------------------------  Cap in MB
Deleted up to this point
----------------------------------------------------------------------  Cap in MB
Deleted up to this point
----------------------------------------------------------------------  Cap in MB
Deleted up to this point

Как это работает

Этот скрипт имеет одну вариабельную f . Когда F верно (1), мы находимся в диапазоне строк, которые будут удалены. Когда он ложь (0), мы находимся в диапазоне, которые должны быть напечатаны.

По умолчанию f false, когда запускается программа.

  • ! F {Print}

    Распечатайте любую строку, когда F неверно.

  • / ------------------------ / {f =! F; если (! F) Печать "удаляется до этой точки"}

    Если мы достигнем линии делителя, отмеченной тиреми, затем переверните значение f . Если F теперь false, затем распечатайте сообщение «Удаленное» сообщение.

Обновление

По умолчанию awk на Solaris, кажется, имеет проблемы. Попробуйте:

nawk '!f{print} /----------------------/{f=!f;if (!f)print "Deleted up to this point"}' foo.txt

или,

/usr/xpg4/bin/awk '!f{print} /----------------------/{f=!f;if (!f)print "Deleted up to this point"}' foo.txt

или,

/usr/xpg6/bin/awk '!f{print} /----------------------/{f=!f;if (!f)print "Deleted up to this point"}' foo.txt

Ответ на пересмотренный вопрос

$ awk ' /^---------------------------------------------------  Cap in MB/{print "Deleted up to this point"; f=0; z=""; next;} /^----------------------------------------------------------------------  Cap in MB/{f=1; if(z)print substr(z,2); z=""; print;next;}  f{z=z"\n"$0;next;} END{print substr(z,2);}' foo.txt
----------------------------------------------------------------------  Cap in MB
Deleted up to this point
----------------------------------------------------------------------  Cap in MB
Deleted up to this point
----------------------------------------------------------------------  Cap in MB
Deleted up to this point
----------------------------------------------------------------------  Cap in MB
line 2
line 3
line 4
line 5
----------------------------------------------------------------------  Cap in MB
line 2
line 3
line 4
line 5
1
27.01.2020, 22:12

Вот простое решение с awk: выключите печать после длинной пунктирной линии, включите Печать после короткой пунктирной линии.

awk '
    !do_not_print {print}
    $0 == "----------------------------------------------------------------------  Cap in MB" {do_not_print = 1}
    $0 == "---------------------------------------------------  Cap in MB" {do_not_print = 0}
' <foo.txt >output.txt
1
27.01.2020, 22:12

Мой взять. Подобно John1024, но как его находится в одной строке, это нечитается.
Испытано на коробке Solaris 8.

/usr/xpg4/bin/awk \
    -v section_start='^----------------------------------------------------------------------  Cap in MB' \
    -v delete_marker='^---------------------------------------------------  Cap in MB' \
'
    $0 ~ section_start {
        for (i=1; i<=n; i++) 
            print line[i]
        n=0
        delete line
        print
        next    
    }
    {line[++n] = $0}
    $0 ~ delete_marker {
        n=1
        delete line
        line[1] = "Deleted up to this point"
    }
    END {for (i=1; i<=n; i++) print line[i]}
' foo.txt
0
27.01.2020, 22:12

Теги

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