Сопоставление текста между двумя словами с помощью команды grep на нескольких строках

Для интерактивного использования в командной строке проще всего ввести

grep. File*.txt

Поскольку регулярное выражение .соответствует любому символу, каждая не-пустая строка каждого файла будет соответствовать и будет напечатана с именем файла в качестве префикса.

Отлично подходит для использования -в таких случаях, как проверка некоторых настроек ядра, которые хранятся с одной настройкой на файл:

$ grep. /sys/kernel/mm/transparent_hugepage/*
/sys/kernel/mm/transparent_hugepage/defrag:[always] defer defer+madvise madvise never
/sys/kernel/mm/transparent_hugepage/enabled:[always] madvise never
/sys/kernel/mm/transparent_hugepage/hpage_pmd_size:2097152
grep: /sys/kernel/mm/transparent_hugepage/khugepaged: Is a directory
/sys/kernel/mm/transparent_hugepage/shmem_enabled:always [within_size] advise never deny force
/sys/kernel/mm/transparent_hugepage/use_zero_page:1
0
30.04.2019, 23:31
4 ответа

С файлом z2, содержащим:

user1:x:1001:1001::/home/user1home:/bin/bash
user2:x:1002:1002::/home/user2home:/bin/bash
user3:x:1003:1003::/home/user3home:/bin/bash
user4:x:1004:1004::/home/user4home:/bin/bash first
user1:x:1001:1001::/home/user1home:/bin/bash
user2:x:1002:1002::/home/user2home:/bin/bash
user3:x:1003:1003::/home/user3home:/bin/bash
user4:x:1004:1004::/home/user4home:/bin/bash second

Утилита cgrepвыдаст:

$ cgrep -e '1002:1002' +w '/home/user4home' z2
========================================
user2:x:1002:1002::/home/user2home:/bin/bash
user3:x:1003:1003::/home/user3home:/bin/bash
user4:x:1004:1004::/home/user4home:/bin/bash first
========================================
user2:x:1002:1002::/home/user2home:/bin/bash
user3:x:1003:1003::/home/user3home:/bin/bash
user4:x:1004:1004::/home/user4home:/bin/bash second

Дополнительная информация оcgrep(контексте, оконном grep):

cgrep   shows context of matching patterns found in files (man)
Path    : ~/executable/cgrep
Version : 8.15
Type    : ELF 64-bit LSB executable, x86-64, version 1 (SYS...)
Home    : http://sourceforge.net/projects/cgrep/ (doc)

С наилучшими пожеланиями... ура, дрл

0
28.01.2020, 03:46

Вы можете использовать:

grep -Pzo "1002:1002.*(\n|.)*/home/user4home" file

Будет соответствовать слову, начинающемуся с 1002:1002до /home/user4home.

0
28.01.2020, 03:46

Вы можете использоватьpcregrep:

$ pcregrep -Mo "(?s)1002:1002.*/home/user4home" file
1002:1002::/home/user2home:/bin/bash
user3:x:1003:1003::/home/user3home:/bin/bash
user4:x:1004:1004::/home/user4home

Модификатор (?s)(, который также может использоваться в grep -P), заставляет .включать \n, так что нет необходимости явно сопоставлять новые строки.

0
28.01.2020, 03:46

Или вы конвертируете файл в одну строку и конвертируете обратно.

$ cat file | tr \\n \\0 | grep -oa '1002:1002.*user4home' | tr \\0 \\n
1002:1002::/home/user2home:/bin/bash
user3:x:1003:1003::/home/user3home:/bin/bash
user4:x:1004:1004::/home/user4home

Вам нужно добавить -aк grep, чтобы обрабатывать двоичные файлы как текст.

0
28.01.2020, 03:46

Теги

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