Для интерактивного использования в командной строке проще всего ввести
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
С файлом 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)
С наилучшими пожеланиями... ура, дрл
Вы можете использовать:
grep -Pzo "1002:1002.*(\n|.)*/home/user4home" file
Будет соответствовать слову, начинающемуся с 1002:1002
до /home/user4home
.
Вы можете использовать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
, так что нет необходимости явно сопоставлять новые строки.
Или вы конвертируете файл в одну строку и конвертируете обратно.
$ 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
, чтобы обрабатывать двоичные файлы как текст.