Как ограничить максимальный объём оперативной памяти для Linux VPS?

Awk был разработан для этого (здесь с GNU awk для захвата скобок совпавших шаблонов в массив в match()):

$ awk '
    NR == FNR { Ids[$1]++; next; }
    match($1, /id=([^;]+);/, Id) && Id[1] in Ids
' /file1 /file2
id=ram;*between*hkjhdswklf     kjsdklhglshglkhgklsdgkhdfg
id=taikah;jhdjfkhg**kjdfkjksfdjk dfkjskdfjkljdflkjsdflj

Несколько альтернативных ответов предлагают решения, которые делают различные предположения о вводе, которые не совсем очевидны в примере, приведенном OP. Однако одно ясно: в данных есть законное слово, следующее за id=xxx;, поэтому небезопасно предполагать, что один из идентификаторов из файла 1 не может быть где-то в данных.

Вот почему Awk намного лучше, чем fgrep(1). Awk разобьет входные данные на поля, которые могут ограничить возможное совпадение, что и было сделано в приведенном примере, указав, что совпадение должно быть в первом поле ($1).

В приведенном примере некоторые данные находятся рядом с идентификатором, поэтому, если бы вы хотели абсолютно надежный способ сопоставления идентификаторов в File 1, вы могли бы определить разделитель полей (FS) как ; и печатать только в случае точного совпадения.

Предположим, что файл 2 содержит:

id=ram;*between*hkjhdswklf     kjsdklhglshglkhgklsdgkhdfg
id=taikah;jhdjfkhg**kjdfkjksfdjk dfkjskdfjkljdflkjsdflj
id=notinlist;jhdjfkhg**kjdfkjksfdjk ram*dfkjskdfjkljdflkjsdflj
id=notinlist;*between*taikah*hkjhdswklf     kjsdklhglshglkhgklsdgkhdfg

Тогда следующее решение будет работать

$ awk -v FS=";" '
    NR == FNR {Id = "id=" $0; Ids[Id]++; next; }
    $1 in Ids
' /file1 /file2
id=ram;*between*hkjhdswklf     kjsdklhglshglkhgklsdgkhdfg
id=taikah;jhdjfkhg**kjdfkjksfdjk dfkjskdfjkljdflkjsdflj

Обратите внимание, что другое решение Awk будет очень медленным для больших файлов, поскольку оно O(N2). Версия sed будет работать, но лично я считаю sed нечитабельным для простых смертных.

0
31.07.2018, 19:50
1 ответ

Вы уже ограничены 4 ГБ памяти; вот что означает значение «4096» в выводе free -m. Ваш график, без сомнения, также учитывает своп, поэтому, когда вы видите, что использование памяти превышает 4 ГБ, это потому, что сумма используемой памяти и свопа превышает 4 ГБ. (Либо так, либо используются степени 10, а не степени 2.)

2
28.01.2020, 02:31

Теги

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