Как может я “grep” шаблоны через несколько строк?

Едва-едва возможно соответствовать чрезвычайно минимальной системе Linux на дискете. (Вот несколько примеров; остерегайтесь этого, многие из них охватывают несколько дискет.) Со всего 1.44 МБ, существует, не имеют любую комнату для любого приложения; я думаю, что можно заставить минималистическую командную строку без интересной команды работать.

Как пример более реалистической крошечной системы, мой домашний маршрутизатор запускает Linux. Целый образ диска (ядро плюс программы) помещается в 4 МБ (на самом деле, я думаю, что это близко к 2.8 МБ). Это - специализированная система, со старой версией ядра, только драйверы, необходимые для того конкретного устройства и не многих программ — главным образом сетевые административные средства, включая маленький веб-сервер, клиент и сервер SSH, оболочку.

Распределение как Ubuntu или Fedora идет с тысячами программ. Некоторые из этих программ берут десятки МБ самостоятельно. Часть документации этих программ берет десятки МБ. Просто драйверы устройств для всех периферийных устройств, сетевые протоколы и другие части ядра берут приблизительно 100 МБ в эти дни — существует столько различных устройств, которые можно подключить к ПК.

Для базовой системы с GUI и веб-браузером, Вам будут нужны несколько сотен МБ. Для большей полной системы с полной настольной средой, текстовой процессор и так далее, рассчитывают на несколько ГБ. Если Вы начинаете иметь несколько альтернатив для каждой программы (Gnome и KDE, Firefox и Chrome, …), небо предел.

Если Вы испытываете желание соответствовать размеру Windows, имеете в виду, что дистрибутив Linux содержит намного больше, чем эквивалент Windows: дистрибутивы как Ubuntu и Fedora поставляют много приложений, которые необходимо было бы установить отдельно в Windows.

25
02.02.2014, 13:03
7 ответов

Вот a sed тот, который даст Вам grep- как поведение через несколько строк:

sed -n '/foo/{:start /bar/!{N;b start};/your_regex/p}' your_file

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

  • -n подавляет поведение по умолчанию печати каждой строки
  • /foo/{} дает этому команду соответствовать foo и сделайте то, что прибывает в squigglies в согласующие отрезки длинной линии. Замена foo со стартовой частью шаблона.
  • :start переходящая маркировка должна помочь нам сохранить цикличное выполнение, пока мы не находим конец нашему regex.
  • /bar/!{} выполнит то, что находится в squigglies к строкам, которые не соответствуют bar. Замена bar с конечной частью шаблона.
  • N добавляет следующую строку к активному буферу (sed вызовы это пространство шаблона)
  • b start безусловно перейдет к start маркируйте мы создали ранее, чтобы продолжать добавлять следующую строку, пока пространство шаблона не содержит bar.
  • /your_regex/p печатает пространство шаблона, если оно соответствует your_regex. Необходимо заменить your_regex по целому выражению Вы хотите соответствовать через несколько строк.
25
27.01.2020, 19:40
  • 1
    +1, Добавляющий это к toolikt!Спасибо. –  wmorrison365 24.04.2018, 18:36

Я обычно использую названный инструмент pcregrep который может быть установлен в большей части использования аромата Linux yum или apt.

Для, например.

Предположим, назвали ли Вам файл testfile с содержанием

abc blah
blah blah
def blah
blah blah

Можно выполнить следующую команду:

$ pcregrep -M  'abc.*(\n|.)*def' testfile

сделать сопоставление с образцом через несколько строк.

Кроме того, можно сделать то же с sed также.

$ sed -e '/abc/,/def/!d' testfile
19
27.01.2020, 19:40

Вот более простой подход с помощью Perl:

perl -e '$f=join("",<>); print $& if $f=~/foo\nbar.*\n/m' file

или (так как JosephR взял sed маршрут, я бесстыдно украду его предложение),

perl -n000e 'print $& while /^foo.*\nbar.*\n/mg' file

Объяснение

$f=join("",<>); : это читает весь файл и сохраняет, это - содержание (новые строки и все) в переменную $f. Мы затем пытаемся соответствовать foo\nbar.*\n, и распечатайте его, если это соответствует (специальная переменная $& содержит последнее найденное соответствие). ///m необходим для создания соответствия регулярного выражения через новые строки.

-0 устанавливает входной разделитель записей. Установка этого к 00 активирует 'режим абзаца', где Perl будет использовать последовательные новые строки (\n\n) как разделитель записей. В случаях, где нет никаких последовательных новых строк, читается весь файл (хлебал) сразу.

Предупреждение:

Не делайте этого для больших файлов, это загрузит весь файл в память, и это может быть проблемой.

5
27.01.2020, 19:40

Один способ сделать это с Perl. например, вот содержание названного файла foo:

foo line 1
bar line 2
foo
foo
foo line 5
foo
bar line 6

Теперь, вот некоторый Perl, который будет соответствовать против любой строки, которая начинается с нечто, сопровождаемого любой строкой, которая начинается с панели:

cat foo | perl -e 'while(<>){$all .= $_}
  while($all =~ /^(foo[^\n]*\nbar[^\n]*\n)/m) {
  print $1; $all =~ s/^(foo[^\n]*\nbar[^\n]*\n)//m;
}'

Perl, сломанный:

  • while(<>){$all .= $_} Это загружает весь стандартный вход в в переменную $all
  • while($all =~ В то время как переменная all имеет регулярное выражение...
  • /^(foo[^\n]*\nbar[^\n]*\n)/m regex: нечто в начале строки, сопровождаемой любым количеством символов неновой строки, сопровождаемых новой строкой, сопровождаемой сразу "панелью" и остальной частью строки с панелью в нем. /m в конце regex означает "соответствие через несколько строк"
  • print $1 Распечатайте часть regex, который был в круглой скобке (в этом случае, все регулярное выражение)
  • s/^(foo[^\n]*\nbar[^\n]*\n)//m Сотрите первое соответствие для regex, таким образом, мы можем соответствовать нескольким случаям regex в рассматриваемом файле

И вывод:

foo line 1
bar line 2
foo
bar line 6
3
27.01.2020, 19:40
  • 1
    Просто зашел, чтобы сказать, что Ваш Perl может быть сокращен к более идиоматическому: perl -n0777E 'say $& while /^foo.*\nbar.*\n/mg' foo –  Joseph R. 02.02.2014, 15:10

Просто нормальный GREEP, который поддерживает Perl-Regexp параметр P , сделает это задание.

$ echo 'abc blah
blah blah
def blah
blah blah' | grep -oPz  '(?s)abc.*?def'
abc blah
blah blah
def

(y) Под названием Dotall-модификатор, который делает точку в вашем регуляторе для соответствия не только персонажам, но и разрывами линии.

2
27.01.2020, 19:40

Я решил этот для меня, используя вариант GreeP и -A с другим GREP.

grep first_line_word -A 1 testfile | grep second_line_word

Опция-A 1 отпечатает 1 строку после обнаруженной линии. Конечно, это зависит от вашего файла и комбинации слов. Но для меня это было самое быстрое и надежное решение.

1
27.01.2020, 19:40

Вы можете использовать Flashrom для обновления BIOS материнской платы.

Пример (ABIT KN9 Ultra):

Доска - доска AMD Athlon 64, сокет AM2, Chipset NVIDIA, выпущенная с 2006 года. Он имеет флеш-микросхему 256 КБ, который заменяемый. BIOS маркируется «наградой», который, кажется, является товарным знаком Phoenix.

Flashrom поддерживает этот чипсет и этот вспышек.

Поддержка может быть проверена с помощью команды, такой как:

# flashrom --programmer internal
Calibrating delay loop... OK.
Found chipset "NVIDIA MCP55".
Enabling flash write... OK.
Enabling full flash access for board "abit KN9 Ultra"... OK.
Found PMC flash chip "Pm49FL004" (512 kB, LPC, FWH) mapped at physical address 0x00000000fff80000.

имеет смысл резервного копирования текущего содержимого Flash Chip, сначала:

# flashrom --programmer internal -c Pm49FL004 -r backup.bin

Затем можно сравнить с файлом Vanilla Image от поставщика (например, XXD и Vimdiff ).

Ожидается, что некоторые различия - потому что некоторые BIOS также хранят дополнительную информацию (например, DMI) и конфигурацию (E.G. MAC-адреса) во вспышке. Это также случай с ABIT KN9 Ultra. Данные DMI хранятся в первом 1872 байтах - и легко воссоздается BIOS во время загрузки. MAC-адреса хранятся на смещении 0x74e30.

Файлы прошивки поставщиков упаковываются в архиве ZIP, который содержит AWDFLASH.exe и файл , например, файл , например M520A_23.Bin . В этом примере файл BIN содержит изображение BIOS AS - есть, т. Е. Это может быть непосредственно написано сделать Flash Chip с помощью команды, как:

# flashrom --programmer internal -c Pm49FL004 -w M520A_23.BIN

Calibrating delay loop... OK.
Found chipset "NVIDIA MCP55".
Enabling flash write... OK.
Enabling full flash access for board "abit KN9 Ultra"... OK.
Found PMC flash chip "Pm49FL004" (512 kB, LPC, FWH) mapped at physical address 0x00000000fff80000.
Reading old flash chip contents... done.
Erasing and writing flash chip... Erase/write done.
Verifying flash... VERIFIED.

, в зависимости от обновления, может потребоваться очистить CMOS CMOS Для следующей перезагрузки - в противном случае BIOS может не запускать. На этой доске CMOS можно очистить через настройку перемычки. Также возможна очистка через программное обеспечение (например, через CMOSPWWD .

Для сохранения уникальных MAC-адресов по умолчанию новое изображение поставщика может быть исправлено перед миганием, например:

dd if=backup.bin of=mac.bin bs=1 count=16 skip=$(echo 16 i 74E30 p | dc)
dd if=mac.bin of=M520A_23_with_mac.bin bs=1 seek=$(echo 16 i 74E30 p | dc) \
   conv=notrunc

подводными камнями:

  • Написание флэш-памяти может потерпеть неудачу из-за включения PORD COMPAND CONPERBOAD (т.е. Для отключения защиты записи) код, который еще не реализован Flashrom.
-121--28543-

Альтернатив GREP просеивает .

Предположим TestFile содержит:

<book>
  <title>Lorem Ipsum</title>
  <description>Lorem ipsum dolor sit amet, consectetur
  adipiscing elit, sed do eiusmod tempor incididunt ut
  labore  et dolore magna aliqua</description>
</book>


SIFT -M '<Описание>. *? ' (показать линии, содержащие описание)

Результат:

testfile:  <description>Lorem ipsum dolor sit amet, consectetur
testfile:  adipiscing elit, sed do eiusmod tempor incididunt ut
testfile:  labore  et dolore magna aliqua</description>


SIFT -M '<Описание> (. *?) ' --replace 'Описание = "$ 1"' --NO-filename (Извлечение и переформатирование описания)

Результат:

description="Lorem ipsum dolor sit amet, consectetur
  adipiscing elit, sed do eiusmod tempor incididunt ut
  labore  et dolore magna aliqua"
2
27.01.2020, 19:40

Теги

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