次の構文を使用できることがわかります。
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