grepを使用して複数行の2つの単語間のテキストを一致させる

grepを使用して複数行の2つの単語間のテキストを一致させる

次の構文を使用できることがわかります。

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

または、ファイルを1行に変換してからもう1行に変換します。

$ 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

関連情報