извлекать строки снизу до совпадения с регулярным выражением

Если вы можете войти в свой Chromebook, сначала попробуйте выполнить следующие действия:
  1. Выключите Chromebook, а затем снова включите его.
  2. Если ваш Chromebook по-прежнему имеет ошибку, сбросьте настройки до заводских .

Если это не работает, на рабочем компьютере (не Chromebook с ошибкой):

  1. Если вы используете Mac или ПК :
    1. Установите Chrome, если вы еще этого не сделали.
    2. Откройте Chrome Chrome.
    3. Установите приложение восстановления.
  2. Откройте приложение восстановления.
  3. Нажмите «Начать».
  4. Нажмите Выберите модель из списка или введите номер модели Chromebook, который вы хотите восстановить. Чтобы найти этот номер, посмотрите внизу сообщения об ошибке на экране Chromebook.
  5. Нажмите «Продолжить».
  6. Вставьте флэш-накопитель USB или SD-карту в компьютер.
  7. В раскрывающемся меню выберите вставленный USB-накопитель или SD-карту.
  8. Нажмите «Продолжить».
  9. Нажмите «Создать сейчас».
  10. Когда вы увидите сообщение о том, что носитель для восстановления готов,извлеките флэш-накопитель USB или SD-карту из компьютера.

На Chromebook с ошибкой:

  1. Если к этому Chromebook (подключено что-либо, например мышь или внешний жесткий диск ), удалите это.
  2. Войти в режим восстановления :
    • Chromebook :Нажмите и удерживайте Esc + Обновить, затем нажмите кнопку питания. Отпустите Силу. Когда на экране появится сообщение, отпустите остальные клавиши.
  3. Вы увидите одно из этих сообщений:

Chrome OS is missing or damaged.

Please insert a recovery USB stick or SD card.

  1. Вставьте флэш-накопитель USB или SD-карту, которые вы использовали для создания носителя для восстановления. Следуйте инструкциям на экране -.

Источник:Восстановление Chromebook .

4
10.09.2019, 21:34
5 ответов

С помощью edвы можете использовать регулярное выражение -для поиска вверх , используя ?pattern?вместо обычного /pattern/(, которое выполняет поиск сверху текущей позиции ). Так например:

$ printf '%s\n' '?ID?+1,$p' q | ed -s file.txt
    1 R    0    0    0    0  0.6 12.0  96:02:53 instance-0000036f
    2 R    0    0    0    0  0.2 12.0  95:44:08 instance-00000372
4
27.01.2020, 20:45

Получение последней записи из строки, начинающейся со строки virt-top, в конец с помощью ed(, подходящей для работы с файлами размером, сравнимым с тем, что вы показываете, а не размером в несколько мегабайт):

$ printf '%s\n' '?^virt-top?,$p' | ed -s file
virt-top time  11:25:17 Host foo.example.com x86_64 32/32CPU 1200MHz 65501MB
   ID S RDRQ WRRQ RXBY TXBY %CPU %MEM   TIME    NAME
    1 R    0    0    0    0  0.6 12.0  96:02:53 instance-0000036f
    2 R    0    0    0    0  0.2 12.0  95:44:08 instance-00000372

Или только строки после последней virt-topстроки, содержащие подстрокуinstance:

$ printf '%s\n' '?^virt-top?,$g/instance/p' | ed -s file
    1 R    0    0    0    0  0.6 12.0  96:02:53 instance-0000036f
    2 R    0    0    0    0  0.2 12.0  95:44:08 instance-00000372

Эта последняя команда ed, ?^virt-top?,$g/instance/p, сначала назначает диапазон строк от последней строки, которая начинается сvirt-top(последней, потому что edзапускает вас с последней строки буфера, а ?re?выполняет поиск назад )до конца буфера($)и применяет к этим строкам команду g/instance/p. Команда g/re/pвыводит все строки в диапазоне, который соответствует заданному регулярному выражению (, откуда grepи получил свое название, кстати ).


Использованиеawk:

$ awk '/^virt-top/ { lines = "" } /instance/ { lines = (lines == "" ? $0 : lines ORS $0) } END { print lines }' file
    1 R    0    0    0    0  0.6 12.0  96:02:53 instance-0000036f
    2 R    0    0    0    0  0.2 12.0  95:44:08 instance-00000372

Это сохраняет строки ввода в linesвсякий раз, когда есть строка, содержащая подстроку instance. Эти строки печатаются в конце. Всякий раз, когда обнаруживается строка, начинающаяся с virt-top, сохраненные строки отбрасываются.

Практически то же самое с sed, с использованием пробела хранения в качестве эквивалента переменной linesв коде awk:

$ sed -n '/^virt-top.*/{ s///; x; d; }; /instance/H; ${ x; s/\n//; p; }' file
    1 R    0    0    0    0  0.6 12.0  96:02:53 instance-0000036f
    2 R    0    0    0    0  0.2 12.0  95:44:08 instance-00000372
1
27.01.2020, 20:45

Это кажется немного глупым, но:

$ tac file.txt |sed -e '/^virt-top/q' |tac
virt-top time  11:25:17 Host foo.example.com x86_64 32/32CPU 1200MHz 65501MB
   ID S RDRQ WRRQ RXBY TXBY %CPU %MEM   TIME    NAME
    1 R    0    0    0    0  0.6 12.0  96:02:53 instance-0000036f
    2 R    0    0    0    0  0.2 12.0  95:44:08 instance-00000372

GNU tacпереворачивает файл (многие не -системы GNU имеют tail -rвместо ), sedвыбирает строки до первой, начинающейся с virt-top. Вы можете добавить sed 1,2dили tail -n +3, чтобы удалить заголовки.

Или в awk:

$ awk '/^virt-top/ { a = "" } { a = a $0 ORS } END {printf "%s", a}' file.txt 
virt-top time  11:25:17 Host foo.example.com x86_64 32/32CPU 1200MHz 65501MB
   ID S RDRQ WRRQ RXBY TXBY %CPU %MEM   TIME    NAME
    1 R    0    0    0    0  0.6 12.0  96:02:53 instance-0000036f
    2 R    0    0    0    0  0.2 12.0  95:44:08 instance-00000372

Он просто собирает все строки в переменную и очищает эту переменную в строке, начинающейся с virt-top.

Если файл очень большой, решение tac+ sedдолжно быть быстрее, так как ему нужно только прочитать конец файла, в то время как решение awkчитает весь файл сверху.

9
27.01.2020, 20:45

Если ваш ввод имеет фиксированное количество блоков, вы также можете сделать что-то вроде:

awk '/^virt-top/ && ++n == 2, 0' <your-file

Для вывода строк со 2-го -го вхождения virt-topдо конца файла (0 означает ложь , означает конец этого первого , последний диапазон никогда не найден ).

3
27.01.2020, 20:45

Вот еще один способ справиться с этим:

$ sed -e '
   /\n/q
   /virt-top/{h;d;}
   H;$!d;g
   s/\n//;D
' file.txt

Результаты

1 R    0    0    0    0  0.6 12.0  96:02:53 instance-0000036f
2 R    0    0    0    0  0.2 12.0  95:44:08 instance-00000372
1
27.01.2020, 20:45

Теги

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