awk - Распечатать все оставшиеся строки

Данные генератора случайных чисел проходят через несколько мест.

  1. Все начинается с ядра. Генератор случайных чисел в ядре, как и любой другой генератор случайных чисел, состоит из детерминированного генератора случайных битов (DRBG ), который засеивается источниками энтропии. DRBG, используемый в Linux, обладает устойчивостью к обратному отслеживанию, что означает, что даже если злоумышленнику удастся узнать состояние RNG в какой-то момент (, требующий доступа на уровне ядра -), он не сможет вычислить предыдущее состояние RNG. состояний, поэтому они не могут найти предыдущие выходные данные.

  2. Ядро не хранит копии данных, которые оно передает процессу catили позже через конвейеры.

  3. После завершения процесса catего память возвращается ядру. Освобожденная память не стирается немедленно :Linux стирает память только перед передачей ее процессу. (Это связано с тем, что очистка при выделении имеет более высокую производительность, чем очистка при освобождении. )Таким образом, возможно, что данные все еще находятся в оперативной памяти некоторое время после завершения cat. Для получения этих данных потребуется доступ на уровне ядра -и некоторые навыки судебной экспертизы, чтобы найти нужную страницу в памяти среди, вероятно, сотен тысяч кандидатов. То же самое касается и других процессов (tr, head).

  4. Трубы нигде не сохраняют свою память. Данные копируются непосредственно из процесса в процесс.

  5. Данные отображаются на терминале. Он может быть сохранен где-то в памяти эмулятора терминала. Он определенно сохраняется до тех пор, пока вы можете вернуться к нему,и копия может остаться в памяти процесса позже, в зависимости от того, как эмулятор терминала управляет своей памятью. Для поиска данных в памяти эмулятора терминала требуется доступ к вашей учетной записи.

  6. Данные, отображаемые на терминале, не сохраняются в файле, если только вы не приложили все усилия для регистрации сеанса.

  7. Данные также могут оставаться в видеопамяти (не в текстовом виде, а в виде группы пикселей, которые отображались в какой-то момент ). Нет механизма стирания видеопамяти и фрагменты изображений иногда могут сохраняться очень долго. Для просмотра видеопамяти требуется доступ на уровне ядра -.

  8. Если вы используете буфер обмена для копирования данных с терминала, вам придется побеспокоиться о том, где могут храниться данные буфера обмена. Копия может некоторое время оставаться в памяти X-сервера, точно так же, как копия может оставаться в памяти эмулятора терминала. Чтобы найти эту копию, требуется доступ на уровне root -и серьезные навыки судебной экспертизы.

  9. Если у вас есть менеджер буфера обмена (, возможно, являющийся частью окружения вашего рабочего стола ), вам следует позаботиться о том, где он может хранить историю содержимого буфера обмена.

Таким образом, единственный практический риск связан с использованием диспетчера буфера обмена.

0
22.01.2020, 17:40
4 ответа
awk 'flag == 0 || some_test { flag = 1 } flag == 1 { processing }'

Это будет использовать логический/двоичный «флаг» для отслеживания того, когда обработка может перейти к концу файла.

Первый блок проверяет точку в данных, с которой может начаться обработка. some_testдолжен быть вашим уже существующим тестом. Она будет осуществляться до тех пор, пока flag == 0. Как только ваш тест верен, флаг переключается на 1, что отключает ваш тест, а также включает блок processing.

Последний блок будет выполняться для всех строк от первой строки, которая запускает ваш some_test, до конца файла.

8
28.01.2020, 02:17

1. Да, использовать диапазон с 0или""(= false, никогда не совпадать с )конечным условием:

awk '<is_within_the_range>, 0'

где <is_within_the_range>— ваше условие, которое может быть любым выражением, кроме другого диапазона.

Условие запуска будет не оцениваться снова после первого совпадения:

$ seq 1 6 | awk '
   function check(){ print "checking", $0; return $1 == 3 }
   check(), 0
'
checking 1
checking 2
checking 3
3
4
5
6

2. Если вам не нравятся диапазоны, вы можете, конечно, просто сделать все это C -как не -неуклюже, выводя все строки явно после того, как условие было выполнено:

seq 1 6 | awk '$1==3 { do print; while (getline > 0) }'

3. Еще одно решение, согласно стандарту POSIX, должно работать с обычными файлами с возможностью поиска (, а не с конвейерами! ), но на самом деле не работает с большинством реализаций awk, было бы полагаться на то, что awk устанавливает указатель файла на конец последней записи при выходе, поскольку все утилиты POSIX должны:

seq 1 6 > file
{ awk '$1 == 3 { print; exit }'; cat; } < file

IMLE работает только с awk/ nawkот Solaris, но не с gawk, mawkили "единственным истинным awk" из *BSD.


4. Наконец, вы можете написать свой собственный конечный автомат (например. установив флаг, а затем проверив его)--на медленном языке высокого уровня, который уже обеспечивает хороший упрощенный интерфейс для него --, но это что-то слишком тупое, чтобы на нем останавливаться.

1
28.01.2020, 02:17

Как только строка файла содержит ШАБЛОН, эта строка и все последующие строки печатаются:

awk 'flag || /PATTERN/{flag=1} flag{print $0}' file

Вы можете заменить «print $0» другим кодом, если требуется дополнительная обработка.

-1
28.01.2020, 02:17

Я предполагаю, что время в вашем журнале отсортировано по возрастанию.

Ваше условие «как только я столкнусь с записью, которая находится в пределах временного диапазона, я знаю, что все последующие записи также будут в пределах временного диапазона» можно записать как:

1

time >= start_of_range, 0 { print }

Где:

  • time— это поле или выражение, которое извлекает время из обрабатываемой строки.

  • start_of_range— наименьшее значение диапазона времени обработки.

  • ,выражают rangeв том смысле, что Awk понимает диапазоны, он начнется в первый раз, когда левая часть ,верна, и закончится, когда правая часть ,верна. В этом случае никогда не (0 ), что применит команду справа ко всем последующим строкам до конца, в данном случае print.

Сделайте это первой строкой вашего awk-скрипта:

awk '$7 >= "2015-08-12", 0 { print }'

И даже печать может быть удалена, так как это действие по умолчанию для истинного шаблона (соответствующего диапазона ).

awk '$7 >= "2015-08-12", 0'

2

Альтернативой может быть замена теста и выполнение:

awk '$7 < "2015-08-12" {next}
     {print}
    ' file

Что можно записать просто как:

awk '$7 < "2015-08-12" {next} 1' file

Но это будет продолжать оценивать тест для всех строк.

1
02.04.2020, 18:23

Теги

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