Обработка больших записей/абзацев

Да, вы должны изменить атрибут gidNumber в записи LDAP пользователя, как сказал пользователь jayhendren.

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

В противном случае пользователи могли бы добавлять себя в любую группу, получая разрешения в системах Linux,эффективно обходить средства контроля безопасности.

Я рекомендую либо...

  • назначить один GID всем пользователям и посоветовать всем никогда не назначать ему какие-либо права/разрешения или...
  • установить только пользовательские -GID, которые больше нигде не используются
2
12.08.2020, 11:01
4 ответа

Другой 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реализаций рассматривали ее как регулярное выражение и делали то, что можно было бы "наивно" ожидать.

3
18.03.2021, 23:13

Наверное, можно было бы сделать более элегантно, но вот решение:

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заменяет шаблон указанной строкой и возвращает количество сделанных замен/замен.

Это было вдохновлено этим ответом .

0
18.03.2021, 23:13

Всякий раз, когда у вас есть \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. 
        

Используя это, вы можете сделать:

  1. Удалите все записи длиннее 100 000 символов(обратите внимание, что это может не совпадать с байтами, в зависимости от кодировки вашего файла):

     perl -00 -ne 'print unless length()>100000' file
    
  2. Обрежьте все записи, длина которых превышает 100 000 символов, удалив все символы после первых 100 000:

     perl -00 -lne 'print substr($_,0,100000)' file
    
  3. Удалить строки, начинающиеся с149:

     perl -00 -pe 's/(^|\n)149\s+[^\n]+//g;' file
    
  4. Удалить строки, начинающиеся с 149, но только если эта запись длиннее 100000 символов:

     perl -00 -pe 's/(^|\n)149\s+[^\n]+//g if length()>100000; ' file
    
  5. Если запись длиннее 100 000 символов, удаляйте строки, начинающиеся с 149, до тех пор, пока запись не станет меньше 100 000 символов или не останется строк со 149:

     perl -00 -pe 'while(length()>100000 && /(^|\n)149\s/){s/(^|\n)149\s+[^\n]+//}' file
    
  6. Если запись длиннее 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
    
  7. Наконец, как указано выше, но удалите целые строки, а не только символы,пока вы не получите правильный размер, чтобы у вас не было усеченных записей:

     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
    
2
18.03.2021, 23:13

Используя 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
  • Любой абзац, длина которого меньше 100 000, печатается как есть.
  • Или же мы сначала пытаемся удалить все поле, первое подполе которого равно 149.
  • В противном случае мы убираем последнее поле из абзаца.
0
18.03.2021, 23:13

Теги

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