Да, вы должны изменить атрибут gidNumber в записи LDAP пользователя, как сказал пользователь jayhendren.
Но я надеюсь, что на сервере LDAP имеется достойный контроль доступа, чтобы пользователи не могли самостоятельно изменить свой первичный GID.
В противном случае пользователи могли бы добавлять себя в любую группу, получая разрешения в системах Linux,эффективно обходить средства контроля безопасности.
Я рекомендую либо...
Другой awk
подход:
awk -v lim=99999 'BEGIN{RS=""; ORS="\n\n"}\
{while (length()>=lim) {if (!sub(/\n149\t[^\n]*/,"")) break;}} length()<lim' file
Это постепенно удалит строки, начинающиеся с 149
, если длина записи превышает предел, указанный в переменной lim
, путем замены их на «ничего» до тех пор, пока либо ограничение не будет сохранено, либо дальнейшее сокращение не будет выполнено. возможное (указано числом фактических замен, равным 0 ). Затем он будет печатать только записи, окончательная длина которых меньше предела.
Недостаток:Он удалит 149
строки, начиная с первой, поэтому, если они представляют собой отдельные элементы непрерывного текста, этот текст станет несколько непонятным.
Примечание:Указание RS=""
вместо явного RS="\n\n"
является переносимым способом использования awk
в «режиме абзаца», как поведение нескольких -символов RS
не определяется спецификацией POSIX. Однако, если в вашем файле могут быть пустые записи, они будут проигнорированы awk
и, следовательно, не будут отображаться в выводе. Если это не то, что вам нужно, возможно, вам придется использовать явную RS="\n\n"
нотацию вместо того, чтобы -большинство awk
реализаций рассматривали ее как регулярное выражение и делали то, что можно было бы "наивно" ожидать.
Наверное, можно было бы сделать более элегантно, но вот решение:
cat records.txt | awk -v RS='' '{if (length>99999) {gsub(/\n149\t[^\n]*\n/,"\n");print $0"\n"} else {print $0"\n"} }'
Я знаю о бесполезном использовании кота, я считаю, что более понятен левый -к -правому потоку .
Где 99999 — пороговый размер, а 149 — начало строки (имя поля ), которое нужно удалить в этом случае.
Я использую не -жадный \n149\t[^\n]*\n/
, чтобы удалить только то, что должно быть ^149\t.*$
.
gsub
заменяет шаблон указанной строкой и возвращает количество сделанных замен/замен.
Это было вдохновлено этим ответом .
Всякий раз, когда у вас есть \n\n
в качестве разделителя записей, подумайте о perl и режиме абзаца (изman perlrun
):
-0[octal/hexadecimal]
specifies the input record separator ($/) as an octal or hexadecimal number.
[...]
The special value 00 will cause Perl to slurp files in paragraph mode.
Используя это, вы можете сделать:
Удалите все записи длиннее 100 000 символов(обратите внимание, что это может не совпадать с байтами, в зависимости от кодировки вашего файла):
perl -00 -ne 'print unless length()>100000' file
Обрежьте все записи, длина которых превышает 100 000 символов, удалив все символы после первых 100 000:
perl -00 -lne 'print substr($_,0,100000)' file
Удалить строки, начинающиеся с149
:
perl -00 -pe 's/(^|\n)149\s+[^\n]+//g;' file
Удалить строки, начинающиеся с 149
, но только если эта запись длиннее 100000 символов:
perl -00 -pe 's/(^|\n)149\s+[^\n]+//g if length()>100000; ' file
Если запись длиннее 100 000 символов, удаляйте строки, начинающиеся с 149
, до тех пор, пока запись не станет меньше 100 000 символов или не останется строк со 149:
perl -00 -pe 'while(length()>100000 && /(^|\n)149\s/){s/(^|\n)149\s+[^\n]+//}' file
Если запись длиннее 100 000 символов, удаляйте строки, начинающиеся с 149
, до тех пор, пока запись не станет меньше 100 000 символов или не останется строк со 149, а если по-прежнему длиннее, чем 100000 символов, печатать только первые 100000:
perl -00 -lne 'while(length()>100000 && /(^|\n)149\s/){
s/(^|\n)149\s+[^\n]+//
}
print substr($_,0,100000)' file
Наконец, как указано выше, но удалите целые строки, а не только символы,пока вы не получите правильный размер, чтобы у вас не было усеченных записей:
perl -00 -ne 'while(length()>100000 && /(^|\n)149\s/){
s/(^|\n)149\s+[^\n]+//
}
map{
$out.="$_\n" if length($out. "\n$_")<=100000
}split(/\n/);
print "$out\n"; $out="";' file
Используя Perl, мы можем сделать следующее:
$ perl -F'\n' -pal -00e '$\=($"="\n")x2;
1 while +length >= 100_000 &&
(s/^149\t.*(?:\n|$)//m or pop(@F),$_="@F");
$\=$" if eof;
' file