Наилучшим вариантом является vim/gvim, как определено Shadur, но если Вы хотите сценарий, можно проверить мой ответ на подобный вопрос на Переполнении стека. Я повторяю свой целый ответ здесь:
Если то, что Вы пытаетесь сделать, относится к языку общего назначения, то это - нетривиальная проблема.
Запускаться с Вас должно будет волноваться о комментариях и строках. Если Вы захотите проверить это на языке программирования, который использует регулярные выражения, то это сделает Ваши поиски тяжелее снова.
Таким образом, прежде чем я могу войти и дать Вам любой совет относительно Вашего вопроса, я должен знать пределы Вашей проблемной области. Если можно гарантировать, что нет никаких строк, никаких комментариев и никаких регулярных выражений для волнения о - или более в общем нигде в коде, что скобки могут возможно использоваться кроме для использования, на которое Вы проверяете, что они сбалансированы - это сделает жизнь намного более простой.
Знание языка, который Вы хотите проверить, было бы полезно.
Если я беру гипотезу, что нет никакого шума, т.е. что все скобки являются полезными скобками, моя стратегия была бы повторяющейся:
Я просто искал бы и удалил бы всех внутренних пар скобки: те, которые не содержат скобок внутри. Это лучше всего сделано путем сворачивания всех строк к единственной длинной линии (и найдите механизм к добавить ссылки строки, должны, необходимо получить ту информацию). В этом случае поиск и замена довольно просты:
Это требует массива:
B["("]=")"; B["["]="]"; B["{"]="}"
И цикл через те элементы:
for (b in B) {gsub("[" b "][^][(){}]*[" B[b] "]", "", $0)}
Мой тестовый файл следующие:
#!/bin/awk
($1 == "PID") {
fo (i=1; i 0 {
count("VIRT")
count("RES")
count("SHR")
count("%MEM")
}
END {
pintf "VIRT=\t%12d\nRES=\t%12d\nSHR=\t%12d\n%%MEM=\t%5.1f%%\n", C["VIRT"], C["RES"], C["SHR"], C["%MEM"]
}
function count(c[)
{
f=F[c];
if ($f ~ /m$/)
{
$f = ($f+0) * 1024
}
C[c]+=($f+0)
}
Мой полный сценарий (без ссылки строки) следующие:
cat test-file-for-brackets.txt | \
tr -d '\r\n' | \
awk \
'
BEGIN {
B["("]=")";
B["["]="]";
B["{"]="}"
}
{
m=1;
while(m>0)
{
m=0;
for (b in B)
{
m+=gsub("[" b "][^][(){}]*[" B[b] "]", "", $0)
}
};
print
}
'
Вывод того сценария останавливается на самом внутреннем недопустимом использовании скобок. Но остерегайтесь: 1/этот сценарий не будет работать со скобками в комментариях, регулярных выражениях или строках, 2/это, не сообщает, где в исходном файле проблема расположена, 3/, хотя он удалит все симметричные пары, он останавливается в самых внутренних состояниях ошибки и сохраняет все englobbing скобки.
Точка 3/является, вероятно, годным для использования результатом, хотя я не уверен в механизме создания отчетов, Вы имели в виду.
Точку 2/относительно легко реализовать, но берет больше, чем работа нескольких минут для создания, таким образом, я оставлю ее до Вас для выяснения.
Точка 1/является хитрой, потому что Вы вводите совершенно новую область конкуренции иногда вкладываемого начала и окончаний или специальных правил заключения в кавычки для специальных символов...
Вы могли limt память usege с/etc/security/limits.conf в этом файле, который Вы помещаете:
domain type item value
где domain
@groupname
, type
hard
или soft
где hard
limt, который не может быть превышен ни при каких обстоятельствах.
item
поле объекта, указывает, какой объект ограничивается. Примеры включают ядро (размер базовых файлов), данные (размер области данных программы), fsize (размер файлов, созданных пользователем), nofile (количество открытых файлов данных), RSS (размер резидентного набора), стек (размер стека), CPU (процессорное время единственного процесса в минутах), nproc (количество параллельных процессов), maxlogins (количество одновременных логинов), и приоритет (приоритет процесса). Данные, RSS и объекты стека все касаются памяти, использованной про - грамм. Эти и другие меры информационной емкости измеряются в килобайтах.
и value
касаются item
поле, которое Вы имеете, выбрало, например, если Вы имеете, выбрал cpu
в item
поле и помещенный 2
в value
затем в случае, если domain
(Вы группируетесь VirtualBox), взятие больше, чем 2
из процессорного времени это будет завершено.
Можно использовать ulimit
также, но это ограничило оболочкой удара только.
Надеюсь эта справка Вы в Вас цель, хотя она не сделана с методом, Вы спросили.
Я предполагаю, что существует что-то не так с Вашим /etc/cgconfig.conf
файл. Эта установка работает на меня:
[root@localhost cgroup]# cat /etc/cgconfig.conf
mount {
memory = /cgroup/memory;
}
[root@localhost cgroup]# service cgconfig start
Starting cgconfig service: [ OK ]
[root@localhost cgroup]# ls
memory
[root@localhost cgroup]# ls memory/
cgroup.event_control memory.limit_in_bytes memory.memsw.max_usage_in_bytes memory.soft_limit_in_bytes memory.use_hierarchy
cgroup.procs memory.max_usage_in_bytes memory.memsw.usage_in_bytes memory.stat notify_on_release
memory.failcnt memory.memsw.failcnt memory.move_charge_at_immigrate memory.swappiness release_agent
memory.force_empty memory.memsw.limit_in_bytes memory.oom_control memory.usage_in_bytes tasks
[root@localhost cgroup]# cgcreate -g memory:vbox
[root@localhost cgroup]# cgset -r memory.limit_in_bytes=512M vbox
[root@localhost cgroup]# cgclassify -g memory:vbox 11727
[root@localhost cgroup]# cat memory/vbox/tasks
11727
Хотя, вместо того, чтобы использовать cgreate
и cgset
команды, я советовал бы Вам просто создавать a /etc/cgconfig.conf
файл, который включал бы эти настройки так, чтобы Вы не повторяли процесс после каждой перезагрузки. В Вашем случае файл был бы похож на это:
[root@localhost cgroup]# cat /etc/cgconfig.conf
mount {
memory = /cgroup/memory;
}
group vbox {
memory {
memory.limit_in_bytes="536870912";
}
}
Теперь, каждый раз Вы запускаете cgconfig
сервис, у Вас будет свой vbox cgroup готовым. Все это необходимо, должно переместить PID virtualbox в /cgroups/memory/vbox/tasks
файл с помощью также cgclassify
или просто echo
число в том файле.