Grep 텍스트 일치 패턴

Grep 텍스트 일치 패턴

조건과 일치하는 줄의 선택된 부분을 인쇄하는 명령을 찾고 있습니다. 예를 들어 내 텍스트 줄은 다음과 같습니다.

p1=X||p2=Y||p3=X||p4=X||p5=X||p6=Y||p7=X

. Y​이 예에서 예상되는 결과는 입니다 p2,p6.

답변1

다음에서 Perl 호환 정규식을 사용하세요 grep.

grep -Po '..(?==Y)' <file

결과:

p2
p6

답변2

이 시도:

echo 'p1=X||p2=Y||p3=X||p4=X||p5=X||p6=Y||p7=X' | grep -o '[^|]*=Y' | cut -d= -f1 | sed -e 'N;s/\n/,/g'

산출:

p2,p6

답변3

awk선택한 정규식 구분 기호를 기반으로 레코드를 읽을 수 있습니다. 예를 들어 '[|\n]'
선택한 구분 기호에 따라 레코드를 필드로 분할할 수도 있습니다. 예를 들어. '='
삼항 연산자는 (condition)?:선행 쉼표를 방지합니다.

awk -F= -vRS='[|\n]' '$2=="Y"{ printf (i?",":"")"%s", $1; i=1 }'

산출:

p2,p6

후행 줄 바꿈이 필요한 경우 END{}섹션에 추가할 수 있습니다. 일치하는 항목이 없을 때 개행 문자가 출력되지 않도록 하려면 ORS출력 레코드 구분 기호( )를 처음에 다음으로 설정할 수 있습니다.전혀를 선택한 다음 \n일치하는 항목이 있는지 여부를 설정합니다.

awk -F= -vRS='|' -vORS= '$2=="Y"{printf (ORS?",":"")"%s", $1; ORS="\n"} END{print ""}'

답변4

간단한 awk

awk -F\| '{for (i=1 ; i<= NF; i++) 
    if ( $i ~/Y/ ) { split($i,A,"=") ; printf "in %d : %s\n",i,A[1] ;}}'

어디

  • -F\||구분자 로 사용
  • {for (i=1 ; i<= NF; i++) 스캔 패턴
  • if ( $i ~/Y/ )발견되면
  • { split($i,A,"=") ; printf "in %d : %s\n",i,A[1] ;}분할 및 인쇄

산출

in 3 : p2
in 11 : p6

printf "%s\n",A[1]패턴 번호를 건너뛰는 데 사용됩니다.

관련 정보