Pregunta sobre el uso de sed, filtrado de datos

Как сказал @Jonathan Kamens, у вас, вероятно, закончились часы. У меня есть готовый скрипт , inotify-consumers, в котором перечислены основные нарушители для вас (в более новой версии также указано имя пользователя, которому принадлежит процесс, см. ниже):

$ time inotify-consumers  

   INOTIFY
   WATCHER
    COUNT     PID     CMD
----------------------------------------
    6688    27262  /home/dvlpr/apps/WebStorm-2018.3.4/WebStorm-183.5429.34/bin/fsnotifier64
     411    27581  node /home/dvlpr/dev/kiwi-frontend/node_modules/.bin/webpack --config config/webpack.dev.js
      79     1541  /usr/lib/gnome-settings-daemon/gsd-xsettings
      30     1664  /usr/lib/gvfs/gvfsd-trash --spawner :1.22 /org/gtk/gvfs/exec_spaw/0
      14     1630  /usr/bin/gnome-software --gapplication-service
   ....

    7489  watches TOTAL COUNT

real    0m0.099s
user    0m0.042s
sys 0m0.062s

Здесь вы быстро поймете, почему ограничение по умолчанию в 8 КБ слишком мало для машины разработки, так как только экземпляр WebStorm быстро достигает его максимума при встрече с папкой node_modulesс тысячами папок. Добавьте наблюдателя веб-пакетов, чтобы гарантировать проблемы...

Несмотря на то, что он был намного быстрее, чем другие альтернативы, когда я делал его изначально, Саймон Маттер добавил несколько улучшений скорости для сильно загруженного Big Iron Linux (сотен ядер ), которые значительно ускорили его, снизив его с десять минут (! )до 15 секунд на своем чудовище.

Как использовать

inotify-consumers --helpЧтобы получить его на свой компьютер, просто скопируйте содержимое скрипта и поместите его куда-нибудь в свой $PATH, например /usr/local/bin. В качестве альтернативы, если вы доверяете этому незнакомцу в сети, вы можете не копировать его и передать в bash через http:

$ curl -s https://raw.githubusercontent.com/fatso83/dotfiles/master/utils/scripts/inotify-consumers | bash 

       INOTIFY
       WATCHER
        COUNT     PID USER     COMMAND
    --------------------------------------
        3044   3933 myuser node /usr/local/bin/tsserver
        2965   3941 myuser /usr/local/bin/node /home/myuser/.config/coc/extensions/node_modules/coc-tsserver/bin/tsserverForkStart /hom
         979   3954 myuser /usr/local/bin/node /home/myuser/.config/coc/extensions/node_modules/coc-tsserver/node_modules/typescript/li
           1   7473 myuser /usr/local/bin/node --no-warnings /home/myuser/dev/dotfiles/common-setup/vim/dotvim/plugged/coc.nvim/build/i
           1   3899 myuser /usr/local/bin/node --no-warnings /home/myuser/dev/dotfiles/common-setup/vim/dotvim/plugged/coc.nvim/build/i

        6990  watches TOTAL COUNT

Как это работает?

Для справки, основное содержание скрипта просто (вдохновлено этим ответом)

find /proc/*/fd \
    -lname anon_inode:inotify \
    -printf '%hinfo/%f\n' 2>/dev/null \
    \
    | xargs grep -c '^inotify'  \
    | sort -n -t: -k2 -r 

Изменение пределов

Если вам интересно, как увеличить лимиты

$ inotify-consumers --limits 

Current limits
-------------
fs.inotify.max_user_instances = 128
fs.inotify.max_user_watches = 524288


Changing settings permanently
-----------------------------
echo fs.inotify.max_user_watches=524288 | sudo tee -a /etc/sysctl.conf
sudo sysctl -p # re-read config

-1
28.09.2021, 23:52
1 ответ

Я не понимаю вашу попытку (почему X-Delete-At, почему Object:, как вы хотите справиться с пропущенными полями? ), поэтому я предлагаю толькоsed--решение:

sed -nE '/Expires:/{s/: [^,]*,/:/;s/0([0-9]{4})/\1_/}
  /store/!{H;$!d;}
  x;s/.*store: ([[:alnum:]]*)[^>]*[> ]*(Delete: ([[:alnum:]]*)[^>]*[> ]*)*(Expires: ([^_]*))*.*/\1,\3,\5/p
  $!d
  x;s/.*store: ([[:alnum:]]*).*/\1,,/p' /tmp/list.txt

Идея состоит в том, чтобы собрать поля в области хранения до следующей store:строки, затем xизменить буферы, чтобы следующая store:строка уже находилась в буфере, а собранные поля можно было отформатировать для вывода.

Весь фокус в сложном регулярном выражении. Необязательные поля помещаются внутрь ()*, поэтому они могут появляться любое количество раз. Если они вообще не отображаются, все регулярное выражение все еще соответствует.

Чтобы поглотить мусор, не поедая дополнительные поля, я выбрал [^>]*вместо .*, используя строки, начинающиеся с >.

Первая строка предназначена для переформатирования даты. Последние две строки обрабатывают случай, когда файл заканчивается строкой store:.

0
29.09.2021, 06:03

Теги

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