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

authpriv является отдельным блоком для маршрутизации сообщений авторизации к файлу журнала, который больше ограничил полномочия, что те из подлинной Другой ОС отправят различные сообщения автору по сравнению с authpriv.

4
23.05.2017, 15:40
5 ответов

Я не уверен, насколько структурированный Ваши данные всего лишь, если это - как Вы показываете, как насчет следующего:

grep -B2 'Auto-Installed: [^1]'

Это предполагает, что каждая строка файла конфигурации включает Auto-Installed строка, которая не могла бы быть корректной.

Вот awk программа, которая я думаю, делает точно, как Вы попросили.

awk 'BEGIN{deleted=3}
     !deleted{printf "%s",l[NR%3]}
     deleted {--deleted}
     {l[NR%3]=/./?$0"\n":$0}
     /Auto-Installed: 1/{deleted=3}
     END{for(i=NR+deleted;i<NR+3;++i)printf "%s",l[i%3]}'
6
27.01.2020, 20:46

Я думаю, что это сделает ya

sed ':a
     $!N                          # slurp
     /Auto-Installed: 1/s/.*//    # kill all buffered on match
     $!{/\n.*\n/{P;D}}            # P/D any third line, D cycles w/o read
     $!ba                         # if no P/D, cycle w/o read anyway
    '
3
27.01.2020, 20:46
  • 1
    , который я попробовал, это хорошо работает также, просто сохраняет пустые строки, которые могут легко быть очищены множество путей! –  slm♦ 18.11.2013, 05:47
  • 2
    я сделал бы это со вторым sed, потому что я - ленивый :-) –  jthill 18.11.2013, 05:47
  • 3
    Меня также, другие, усложнял бы нам жизнь для использования слишком многих команд, но легче grep -v "^$" впоследствии избавиться от них. 73% сценариев делают то, что более легко/более лениво. –  slm♦ 18.11.2013, 05:48

Вместо того, чтобы даже пытаться иметь дело с исключением их, почему не только выбирают противоположные строки, которые, оказывается, то, что Вы хотите так или иначе?

$ grep -B 2 "Auto-Installed: 0" data.txt 
Package: transfig
Architecture: amd64
Auto-Installed: 0

Исключая разделы, которые "Автоустановили: 1 дюйм

Если требуется использовать grep но с помощью логики для приближения к проблеме, где Вы исключаете разделы, которые содержат "Автоустановленный: 1 дюйм я не придумал этот подход с помощью средства PCRE в GNU grep.

$ grep -B2 -P 'Auto-Installed: (?!1)' data.txt 

Пример

$ grep -B2 -P 'Auto-Installed: (?!1)' data.txt 
Package: transfig
Architecture: amd64
Auto-Installed: 0

Вышеупомянутое использует предварительную функцию Perl, (?!..). Это позволяет нам делать поиск соответствия строк, которые не содержат значение 1, после Auto-Installed:. Мы затем говорим grep отобразить 2 строки (-B2) к тому времени "соответствие".

3
27.01.2020, 20:46
  • 1
    Это - хорошее. –  jthill 18.11.2013, 05:44
  • 2
    Да, я хотел использовать молоток с двойным когтем :(. Но поскольку я не сделал нашел путь к этому через и задавался вопросом, было ли это возможно. ;) –  Braiam 18.11.2013, 05:50
  • 3
    @Braiam - да grep не может сделать диапазона и -v переключатель. –  slm♦ 18.11.2013, 05:55

То, что Вы имеете, является на самом деле записями, разделенными пустыми строками. Вместо того, чтобы кодировать некоторый хрупкий парсинг, который зависит от порядка и количества строк, используйте инструмент как awk или жемчуг для обработки записей, разделенных пустыми строками (режим абзаца).

awk -F '' '! /^Auto-Installed: 1$/'
2
27.01.2020, 20:46
  • 1
    я ожидаю что строки прежде Auto-Installed: 0 появляется (который является детерминантом). Я пытаюсь построить упаковывать/автоустанавливать отношения (который является моей заключительной целью), где я интересуюсь записями, где Автоматический Установленный 0. –  Braiam 19.11.2013, 02:52
  • 2
    @Braiam строки прежде Auto-Installed: 0 действительно появиться. -F с awk наборов пустого аргумента к режиму абзаца (это подобно коду Perl в ответе terdon). –  Gilles 'SO- stop being evil' 19.11.2013, 02:56

И вот является обязательный Perl путем:

perl -000ne 'print unless /Auto-Installed: 1/' file

Волшебство -000, это включает режим абзаца Perl, который заставляет его разделить файлы на абзацы. Другими словами, записи разделяются двумя или больше последовательными \n персонажи.

Это также распечатает пустую строку между записями, для избавлений, которых, Вы могли работать

perl -000ne 'print unless /Auto-Installed: 1/' file | grep .
2
27.01.2020, 20:46

Теги

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