Синтаксический анализ результата с помощью sed

Вам даже не нужно проверять, работает ли emacs. emacsclient может запустить демон emacs, если он еще не запущен. От emacsclient (1) :

   -a, --alternate-editor=EDITOR
          if the Emacs server is not running,  run  the  specified  editor
          instead.   This can also be specified via the `ALTERNATE_EDITOR'
          environment variable.  If the  value  of  EDITOR  is  the  empty
          string,  run `emacs --daemon' to start Emacs in daemon mode, and
          try to connect to it.

Я использую псевдоним ge для редактирования файлов, определенный следующим образом:

alias ge="emacsclient -c -n --alternate-editor=\"\""
-121--78633-

В большинстве случаев необходимо удалить профиль браузера.

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

Удаление всей системы нецелесообразно, по крайней мере, если вы выполнили обычный просмотр и установку и не приняли установку встроенных подключаемых модулей кода, которые могут получить доступ к компьютеру за пределами изолированной программной среды браузера.

Обратите внимание, что удаления всей системы может быть недостаточно, если вы активировали любой вид онлайн-синхронизации (например, через аккаунт Google). В этом случае необходимо удалить или прекратить использование учетной записи в Интернете.

-121--243222-

Это невозможно в целом. Это может быть возможно в вашем конкретном случае.

Сразу после выполнения фоновой команды идентификатор процесса может быть обнаружен из родительского . Если вы выполняете команду переднего плана (дочерний объект мастер-программы), а эта команда, в свою очередь, выполняет фоновую команду (внук мастер-программы), мастер-программа не имеет прямой видимости на своем внуке: все, что она знает, это запуск дочернего процесса, который теперь вышел.

Ядро отслеживает child→parent отношения процессов. Можно запустить ps -o ppid = -p $ pid , чтобы увидеть идентификатор процесса родительского процесса процесса с идентификатором $ pid . Ядро не отслеживает бабушку и дедушку процесса. Кроме того, если родитель умирает, процесс принимается init (процесс номер 1), поэтому его идентификатор родительского процесса будет равен 1 с этого момента.

Существует несколько других унаследованных атрибутов процесса, которые можно отслеживать. Однако внук может развестись с любым из этих атрибутов. Если внук предназначен для запуска в качестве демона, он, вероятно, попытается максимально изолировать себя (либо от промежуточного ребенка, либо от самого внука), чтобы он не был привязан к вашему интерактивному сеансу и не рисковал попасть ни в что, происходящее с этим сеансом.

Можно искать процессы в той же группе процессов, что и текущий процесс ( ps -o pgid = )). Это приведет к захвату любого другого процесса, запущенного в той же группе процессов,но, наоборот, пропустите внука, если он работает в собственной группе процессов из-за вызова setpgid или setpgrp в потомке или внуке, что демоны и делают.

Можно искать процессы в том же идентификаторе сеанса, что и текущий процесс ( ps -o sid = ). Это приведет к перехвату любого другого процесса, запущенного в пределах того же идентификатора сеанса, но, наоборот, пропустит внука, если он запускается в собственном сеансе из-за вызова setsid в потомке или внуке, что демоны и делают.

Можно открыть временный файл и найти процессы с открытым файлом ('fuser «$ tmpfile»). Это более надежно, поскольку процессы, запущенные только из части главного процесса, в которой был открыт этот файл, не будут улавливаться другими компонентами главного процесса. Тем не менее, как и другие решения, он пропустит внука, если он или промежуточный потомок закрыл файловые дескрипторы, которые он не использовал, что демоны сделать.

Большинство демонов имеют опцию командной строки, чтобы оставаться на переднем плане. Затем можно запустить демон --foreground & daemon_pid=$! , и вы должны принять меры предосторожности, чтобы избежать захвата демона при выходе из сеанса ( nohup daemon --foreground daemon.log 2 > & 1 & является хорошим началом).

2
03.05.2018, 18:38
4 ответа
du -shm /var/vmail/mailboxes/domain/*/mail | awk -F '[ /]' '{ print $1, $7 }'

При вводе из duв указанном вами формате это будет производить

80 USER1
150 USER2
220 USER3

Программа awkпросто выбирает соответствующие поля из вывода du. Он интерпретирует каждую строку как поля, разделенные пробелами или косой чертой.

awk -F '[ /]' '{ print $1, $(NF - 1) }'также будет работать.

Чтобы передать это в JSON, используйтеjq:

du -shm /var/vmail/mailboxes/domain/*/mail |
awk -F '[ /]' '{ print $1, $7 }' |
jq -sR 'split("\n")[0:-1] | map(split(" ")) | map({(.[1]):.[0]}) | add'

Это даст

{
  "USER1": "80",
  "USER2": "150",
  "USER3": "220"
}

Выражение jqсначала разбивает ввод на отдельные элементы массива (по одному на строку ввода ), а затем снова разбивает их по пробелам на подмассивы. На данный момент имеем

[
  [
    "80",
    "USER1"
  ],
  [
    "150",
    "USER2"
  ],
  [
    "220",
    "USER3"
  ]
]

После этого создаются объекты со вторым элементом в каждом подмассиве в качестве ключа и первым в качестве значения:

[
  {
    "USER1": "80"
  },
  {
    "USER2": "150"
  },
  {
    "USER3": "220"
  }
]

addв конце дает нам окончательный результат.

2
27.01.2020, 21:50

попробуй

du -sm /var/vmail/mailboxes/domain/*/mail |
  sed 's:/var/vmail/mailboxes/domain/::; s:/mail::'

где

  • s:/mail::ничем не заменит /mail

перейти к json

du -sm /var/vmail/mailboxes/domain/*/mail |
  sed 's:/var/vmail/mailboxes/domain/::; s:/mail::' |
  awk 'BEGIN { sep="{" ;} { printf "%s \"%s\":%s",sep,$2,$1; sep="," } END { printf "}\n"}'
3
27.01.2020, 21:50

Это немного сложно сделать с sed. Однако вот закомментированное предложение, которое работает с GNU sed:

parse.sed

s|([^ ]+).*/([^/]+)/.*|  "\2" : \1,|   # Extract size and name in json-format
1h; 1!H                                 # Correctly add them to hold-space
$ {
  z                                     # Clear pattern-space
  s/^/\{/                               # Prepend start-curly-brace
  G                                     # Fetch formatted json from hold-space
  s/,$//                                # Remove last comma
  s/$/\n\}/                             # Append end-curly-brace
  p                                     # Print
}

Запустите это так:

du -shm /var/vmail/mailboxes/domain/*/mail | sed -Enf parse.sed

Или в виде одного -вкладыша:

du -shm /var/vmail/mailboxes/domain/*/mail |
sed -Ene 's|([^ ]+).*/([^/]+)/.*|  "\2" : \1,|;1h;1!H;${z;s/^/\{/;G;s/,$//;s/$/\n\}/;p}'

Выход в обоих случаях:

{
  "USER1" : 80,
  "USER2" : 150,
  "USER3" : 220
}
1
27.01.2020, 21:50

jqдовольно хорошо работает с необработанным текстом -, т.е. с флагом -R, например.:

du -sm /var/vmail/mailboxes/domain/*/mail |
jq -R '
  split(" ") |
   .[0]                      as $size |  # Remember size 
   .[1] | split("/") |.[-2] as $name |  # Extract username
    { ($name) : ($size) }                 # Compose object
' 

Дает вам:

{
  "USER1": "80"
}
{
  "USER2": "150"
}
{
  "USER3": "220"
}

Чтобы объединить объекты, используйте второй jqвызов:

... | jq -s add

Выход:

{
  "USER1": "80",
  "USER2": "150",
  "USER3": "220"
}

Или в компактном режиме:

... | jq -sc add

Выход:

{"USER1":"80","USER2":"150","USER3":"220"}
1
27.01.2020, 21:50

Теги

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