grep을 사용하여 여러 줄의 두 단어 사이의 텍스트 일치

grep을 사용하여 여러 줄의 두 단어 사이의 텍스트 일치

다음과 같은 구문을 사용할 수 있다는 것을 알고 있습니다.

grep -oP '.word1.*?word2'

그러나 이것은 여러 줄에서는 작동하지 않습니다. 입력 예는 다음과 같습니다.

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

내가 사용하려는 명령은 다음과 같습니다.

grep -oP '.1002:1002.*?user4home'

내가 원하는 출력은 다음과 같습니다.

1002:1002::/home/user2home:/bin/bash
user3:x:1003:1003::/home/user3home:/bin/bash
user4:x:1004:1004::/home/user4home

답변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)

행운을 빕니다... 건배, drl

답변2

당신은 그것을 사용할 수 있습니다 :

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

1002:1002로 시작하는 단어와 일치합니다 /home/user4home.

답변3

당신은 그것을 사용할 수 있습니다 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

답변4

또는 파일을 한 줄로 변환한 후 다시 한 줄로 변환합니다.

$ 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

관련 정보