=記号の後の値を見つけるためにgrepする方法

=記号の後の値を見つけるためにgrepする方法

可能なすべての値を見つけるためにgrepを指定する方法

つまり、次のファイルを使用してください(9701どんな値でも可能です)。

9701=1?? 
9701=10.Pp 
9701=1a 8a 
9701=3.a_tt 
9701=1/a -00
9701=Bg1998pps

私が試すことができます

egrep -Eo '9701=[A-Z]+[a-z]+[0-9]{1,50}' test.log

これは大文字/小文字と数値のみを提供します。 grepリクエストに特殊文字を含む値を含める方法は?つまり、スペース、ドット、ハイフン、アンダースコアなどを使用します。

答え1

cut -d '=' -f 2-  data.in

これにより、各行が複数の別々のフィールドとして処理され、=最初のフィールド以降のすべての項目が返されます。

出力:

1??
10.Pp
1a 8a
3.a_tt
1/a -00
Bg1998pps

行の最初の部分に関連するコンテンツのみを返す必要がある場合(9701あなたの場合):

grep '^9701=' data.in | cut -d '=' -f 2-

または全体の内容は次のとおりですawk

awk -F '=' '$1 == "9701" { sub(/^[^=]+=/,""); print }' data.in

これは、最初の区切り文字フィールドの文字列比較を実行し=て関心のあるレコードを見つけ、最初のフィールドと=区切り文字を削除して残りの内容を出力します。

答え2

他のすべての文字を含めるには、grep次のコマンドを使用できます。

grep -Eo '9701=.{1,50}' test.log

ドットはすべての文字を表します。

ただし、これは各行の「9701 =」部分を切り捨てません。これを達成するには、次のものを使用できます。cut

cut -d "=" -f 2- test.log

=も含めると問題が発生する可能性があります。

sedこの問題を解決し、最終的に問題に対するより良い解決策を提供します。

sed -r 's/^9701=(.*)$/\1/' test.log

または

sed 's/^9701=\(.*\)$/\1/' test.log

でも

sed 's/^9701=//' test.log

答え3

そしてpcregrep

pcregrep -o1 '9701=(.*)'

9701=行の左端の項目の右側を印刷します(9701 =を含む行の場合)。

十分に新しいPCREで構築されたGNUの使用grep

grep -Po '9701=\K.*'

9701=入力などの空行(つまり、9701=後に空の文字列が続く場合)は報告されません。

標準的にこれは仕事になりますsed

sed -n 's/9701=/\
/;s/.*\n//p'

答え4

grepPerl-regexモードからlookbehind

grep -oP '=\K.+'

関連情報