가능한 모든 값을 찾기 위해 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
grep
Perl-regex
모드 에서 lookbehind
:
grep -oP '=\K.+'