Вы могли всегда просто выполнять его в бесконечном цикле и избегать проблем буферизации. Так как вы, по-видимому, не будете выполнять это долгое время и можете остановить его вручную, просто выполнить
while true; do
ps -p $( tail -n1 /var/log/audit/audit.log |
grep -oP 'comm="prelink".*pid=\K[0-9]*' ) 2>/dev/null
, Который будет постоянно печатать последнюю строку файла, извлекать PID, если таковые имеются, и работать -p
пикосекунды на нем. Это будет жаловаться, нет ли никакого PID, таким образом, необходимо перенаправить вывод ошибок. Я также объединил ваши власти в единственную команду. \K
является функцией PCRE (включенный -P
), который означает, "забывают, что все соответствует до сих пор". Это очень полезно объединенный с -o
для печати только частей соответствия.
Вышеупомянутое не изящно, и оно массово разошлет ваш ЦП со многими процессами, но это должно быть достаточно для быстрой проверки.
Это должно сработать:
sed 's/.*[0-9]c[0-9].*//g' file.txt
Однако, как упоминалось в комментарии, вышеприведенная команда не удалит полные строки, поэтому лучшим способом будет использование команды d
на соответствующих строках:
sed '/[0-9]c[0-9]/d' file.txt
Или с расширенными регулярными выражениями с GNU sed
(-E
является предпочтительным флагом совместимости с BSD* sed
s):
sed -E '/^[[:blank:]]*[0-9]+[a-z]+[0-9]/d' file
Возьмите путь Perl.
Тест с:
perl -ne 's/^\s*[0-9]+c[0-9]+$//g; if ($_ !~ /^$/) {print }' file.txt
Измените файл file.txt
с:
perl -ne 's/^\s*[0-9]+c[0-9]+$//g; if ($_ !~ /^$/) {print }' -i file.txt
grep
(и egrep
или его современный эквивалент grep -E
) является вашим другом:
man grep
См. вариант -v
.
Здесь:
grep -Exv '[[:blank:]]*[0-9]+c[0-9]+[[:blank:]]*' file
отфильтровывает строки, состоящие из c
, окруженные десятичными цифрами и необязательными пробелами.