идентификация слов в файле 1 и соответствие им во второй файл и печать их

Поскольку SELinux включен в Ваше ядро Linux, запрещение его и удаление программ пространства пользователя недостаточно. Необходимо также восстановить ядро, которое будет действительно избавлено от него. Но в целом я не вижу оснований, почему должны быть бэкдоры в SELinux особенно а не в других компонентах (программное обеспечение или аппаратные средства).

Удаление его делает Вашу систему более уязвимой против других нападений. Если Вы имеете проблемы безопасности и не любите SELinux, Вы могли бы интересоваться концепциями безопасности других как, например, AppAmor или grsecurity (который кажется, больше активно не разрабатываются). Посмотрите, например, Что использовать для укрепления поля Linux? Apparmor, SELinux, grsecurity, ВКУС, chroot?.

2
16.03.2014, 07:00
5 ответов

Вот один из способов сделать это:

awk 'FNR==NR{ids[$0]=$0;next}{for(id in ids){if($0 ~ id){print}}}' file1 file2
2
27.01.2020, 21:50

Еще один запутанный sed:

echo | sed -e '1,/^$/{H;d;}
               G;/id=\([^;]\{1,\}\);.*\n\1\n/!d
               s/\n.*//' file1 - file2

POSIX-версия myq's, с тем же ограничением:

awk '
  NR == FNR { Ids[$1]++; next; }
  match($0, /id=[^;]+/) && substr($0, RSTART+3, RLENGTH-3) in Ids
' file1 file2

Подход с использованием grep:

sed 's/.*/id=&;/' file1 | grep -Ff - file2
2
27.01.2020, 21:50
    sed -rfn - <<-HD ./file2
        $(sed -r 's|.*|s/id=&/\&/p|' ./file1)
    HD

Это работает.Сначала он считывает только file1 и преобразует каждую из своих строк в регулярное выражение sed для file2 , w для каждой из этих строк. на его stdout , который является подоболочкой, выполняемой в документе здесь, назначенном второму дескриптору файла sed << - HD 0. Итак Вызов sed второй извлекает sed вывод первого в качестве шаблона регулярного выражения из - stdin . Его сценарий выглядит так:

    s/id=ram/&/p
    s/id=Tarah/&/p
    s/id=taikah/&/p

Выше показан сценарий, который запускается при втором вызове sed . Поскольку каждая строка в file1 преобразуется в буквальное соответствие id = * для file2 , не полагаясь на какой-либо адрес ссылки перед ] i в id или после следующего : точка с запятой ; Я не думаю, что он может пропустить что-нибудь, и должен (надеюсь, сейчас) быть очень легко изменен для обработки любых изменений исходной потребности по мере необходимости.

И когда sed two завершится, результат будет выглядеть следующим образом:

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

P.S. Если вы хотите посмеяться, взгляните на историю редактирования этого ответа - мой путь к этому решению был более чем запутанным - это было крушение поезда.

1
27.01.2020, 21:50

Это именно то, для чего был создан fgrep (1) ... или более современно (могут использоваться расширения GNU):

grep -Fwf file1 file2

Из man grep :

   -F, --fixed-strings
          Interpret PATTERN as a  list  of  fixed  strings,  separated  by
          newlines,  any  of  which is to be matched.  (-F is specified by
          POSIX.)
   -f FILE, --file=FILE
          Obtain  patterns  from  FILE,  one  per  line.   The  empty file
          contains zero patterns, and therefore matches nothing.   (-f  is
          specified by POSIX.)
   -w, --word-regexp
          Select  only  those  lines  containing  matches  that form whole
          words.  The test is that the matching substring must  either  be
          at  the  beginning  of  the  line,  or  preceded  by  a non-word
          constituent character.  Similarly, it must be either at the  end
          of  the  line  or  followed by a non-word constituent character.
          Word-constituent  characters  are  letters,  digits,   and   the
          underscore.
3
27.01.2020, 21:50

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 нечитабельным для простых смертных.

3
27.01.2020, 21:50

Теги

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