Chrome OS is missing or damaged.
Please insert a recovery USB stick or SD card.
Источник:Восстановление Chromebook .
С помощью 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
Получение последней записи из строки, начинающейся со строки 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
Это кажется немного глупым, но:
$ 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
читает весь файл сверху.
Если ваш ввод имеет фиксированное количество блоков, вы также можете сделать что-то вроде:
awk '/^virt-top/ && ++n == 2, 0' <your-file
Для вывода строк со 2-го -го вхождения virt-top
до конца файла (0 означает ложь , означает конец этого первого , последний диапазон никогда не найден ).
Вот еще один способ справиться с этим:
$ 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