これを使用して:
grep -A1 -B1 "test_pattern" file
ファイル内の一致したパターンの前後に1行生成されます。行ではなく、指定した文字数を表示する方法はありますか?
ファイル内の行は非常に大きいため、行全体を印刷するのではなく、コンテキスト内の一致のみを観察します。これを行う方法に関する提案はありますか?
3文字前と4文字後
$> echo "some123_string_and_another" | grep -o -P '.{0,3}string.{0,4}'
23_string_and
grep -E -o ".{0,5}test_pattern.{0,5}" test.txt
これは、パターンの前後で最大5文字に一致します。 -oスイッチは、grepに一致のみを表示するように指示し、-Eは拡張正規表現を使用するように指示します。式を引用符で囲んでください。そうしないと、シェルによって解釈される場合があります。
使用できます
awk '/test_pattern/ {
match($0, /test_pattern/); print substr($0, RSTART - 10, RLENGTH + 20);
}' file
gawk
を使用すると、一致関数を使用できます。
x="hey there how are you"
echo "$x" |awk --re-interval '{match($0,/(.{4})how(.{4})/,a);print a[1],a[2]}'
ere are
Perl
でよければ、より柔軟な解決策:以下は、パターンの前に実際のパターンが続き、パターンの後に5文字が続く3文字を出力します。
echo hey there how are you |Perl -lne 'print "$1$2$3" if /(.{3})(there)(.{5})/'
ey there how
これは、文字だけでなく単語にも適用できます。以下は、実際に一致する文字列の前に1つの単語を出力します。
echo hey there how are you |Perl -lne 'print $1 if /(\w+) there/'
hey
以下は、パターンの後に1つのWordを印刷します。
echo hey there how are you |Perl -lne 'print $2 if /(\w+) there (\w+)/'
how
次の例では、パターンの前に1ワード、次に実際のワード、パターンの後に1ワードが印刷されます。
echo hey there how are you |Perl -lne 'print "$1$2$3" if /(\w+)( there )(\w+)/'
hey there how