= 기호 뒤의 값을 찾기 위해 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.+'

관련 정보