После некоторого эксперимента я могу подтвердить, что на самом деле это происходило в сочетании с огромным разделом подкачки (16 ГБ).
Спасибо за комментарии, Отеус и Кас, у вас была правильная интуиция. Я недооценил эффект. Может быть, потому, что предыдущие машины, которые я использовал, имели меньшее пространство подкачки (по сравнению с памятью), так что в конечном итоге требовавший памяти процесс был убит.
В качестве меры безопасности я уменьшу максимальное пространство подкачки в моей системе. Я также определил ограничение для каждого процесса, чтобы защитить память от одного процесса:
# limit memory usage to 10G per process
ulimit -Sv 10000000
Инструменты, такие как vmstat 1
, могут помочь проанализировать проблему.
$ awk '{ sub("\.com$", ".org", $1); print }' <file
foobar@example.org foo@example.com,bar@example.com
Здесь используется awk
для замены текста, совпадающего с \.com$
на .org
в первом пробеле -разделенном поле (только )каждой строки. Вывод будет разделен пробелом -.
Вы можете сделать это, используя sed
, просто используйте регулярное выражение, которое может соответствовать только первому слову строки:
sed -r 's/^(\S+)\.com(\s+)/\1.org\2/'
Во время -пн, изменить:
^(\S+)
).com
.com
)в:
.org
Если вы просто хотите заменить первое вхождение .com
на .org
, все, что вам нужно, это поведение по умолчанию оператора sed s///
. Только не используйте флаг g
:
$ sed 's/.com/.org/' file
foobar@example.org foo@example.com,bar@example.com
Если вы действительно хотите внести изменения только в первое поле, определенное запятой -, чтобы, если первое .com
появилось в другом месте строки, оно осталось неизменным, вы можете сделать что-то вроде:
$ perl -pe 's/^(\S+)\.com/$1.org/' file
foobar@example.org foo@example.com,bar@example.com
Или, что безопаснее, если com
встречается как подстрока (, например.foo.common.net
):
$ perl -pe 's/^(\S+)\.com\b/$1.org/' file
foobar@example.org foo@example.com,bar@example.com
Альтернативно, в GNU sed:
$ sed -E 's/^(\S+)\.com\b/\1.org/' file
foobar@example.org foo@example.com,bar@example.com
Или, переносимо (, предполагая, что первое поле определяется первым пробелом , а не табуляцией или другим пробелом):
$ sed -E 's/^([^ ])\.com /\1.org /' file
foobar@example.org foo@example.com,bar@example.com