Как grep для значения после знака =

Как указать grep для поиска всех возможных значений

т.е. с файлом типа ( 9701 может быть любым значением):

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

Я мог бы попробовать

 egrep -Eo '9701=[AZ]+[az]+[0-9]{1,50}' test.log 

Это дает мне только верхние и нижние регистровые и числовые значения. Как включить значения со специальными символами в запросе grep? т.е. с пробелами, точками, дефисами, подчеркиваниями и т. д.

Чтобы включить все остальные символы в ваш grep вы можете использовать это:

 egrep -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 

С pcregrep :

 pcregrep -o1 '9701=(.*)' 

Распечатал бы то, что справа от самого левого появления 9701= на линии (для тех строк, которые содержат 9701 =).

С GNU grep созданным с достаточно недавним PCRE:

 grep -Po '9701=\K.*' 

Хотя это не сообщит пустую строку для ввода, например 9701= (то есть, что после 9701= – это пустая строка).

Как правило, это была бы работа для sed :

 sed -n 's/9701=/\ /;s/.*\n//p' 
 cut -d '=' -f 2- data.in 

Это будет относиться к каждой строке как к числу полей с разделителем = -delimited и возвращать все после первого поля

Вывод:

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

Если вы должны быть уверены, что возвращаете вещи, связанные с начальной частью строки ( 9701 в вашем случае):

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

В качестве альтернативы, все это с awk (хотя это не удастся, если на строке больше одного = )

 awk -F '=' '/^9701/ { print $2 }' data.in 

Попытайтесь все это сделать, а это не = :

 # echo '9701=1?? 9701=10.Pp 9701=1a 8a 9701=3.a_tt 9701=1/a -00 9701=Bg1998pps' | egrep -o '9701=[^=]{1,50}' 9701=1?? 9701=10.Pp 9701=1a 8a 9701=3.a_tt 9701=1/a -00 9701=Bg1998pps # echo '9701=Bg19=98pps' | egrep -o '9701=[^=]{1,50}' 9701=Bg19 ## If you too need to include equal char # echo '9701=Bg19= 98pps' | egrep -o '9701=.{1,50}' 9701=Bg19= 98pps 

grep в режиме Perl-regex с lookbehind :

 grep -oP '=\K.+'