다음과 같은 구문을 사용할 수 있다는 것을 알고 있습니다.
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