조건과 일치하는 줄의 선택된 부분을 인쇄하는 명령을 찾고 있습니다. 예를 들어 내 텍스트 줄은 다음과 같습니다.
p1=X||p2=Y||p3=X||p4=X||p5=X||p6=Y||p7=X
. Y
이 예에서 예상되는 결과는 입니다 p2,p6
.
답변1
다음에서 P
erl 호환 정규식을 사용하세요 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]
패턴 번호를 건너뛰는 데 사용됩니다.