Удалите строки в сценарии оболочки

Вы могли всегда просто выполнять его в бесконечном цикле и избегать проблем буферизации. Так как вы, по-видимому, не будете выполнять это долгое время и можете остановить его вручную, просто выполнить

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 для печати только частей соответствия.

Вышеупомянутое не изящно, и оно массово разошлет ваш ЦП со многими процессами, но это должно быть достаточно для быстрой проверки.

0
05.05.2015, 01:47
3 ответа

Это должно сработать:

sed 's/.*[0-9]c[0-9].*//g' file.txt

Однако, как упоминалось в комментарии, вышеприведенная команда не удалит полные строки, поэтому лучшим способом будет использование команды d на соответствующих строках:

sed '/[0-9]c[0-9]/d' file.txt

Или с расширенными регулярными выражениями с GNU sed (-E является предпочтительным флагом совместимости с BSD* seds):

sed -E '/^[[:blank:]]*[0-9]+[a-z]+[0-9]/d' file
2
28.01.2020, 02:36

Возьмите путь 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
0
28.01.2020, 02:36

grepegrep или его современный эквивалент grep -E) является вашим другом:

man grep

См. вариант -v.

Здесь:

grep -Exv '[[:blank:]]*[0-9]+c[0-9]+[[:blank:]]*' file

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

0
28.01.2020, 02:36

Теги

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