텍스트 옆에 Sed 또는 Grep 번호를 사용하는 방법

텍스트 옆에 Sed 또는 Grep 번호를 사용하는 방법

아래와 같은 파일이 있습니다. info2의 오른쪽 값을 반환하고 싶습니다. 둘째, 동일한 방식으로 info5의 값을 반환하고 싶습니다.

문서:

info1 218, info2 111, info3 415, info5 done,

답변1

그리고 awk:

$ awk 'BEGIN { RS="," } $1 ~ /info[25]$/ { print $2 }' input
111
done

입력 레코드 구분 기호( RS)를 쉼표로 설정한 다음 첫 번째 필드에 info2 또는 5가 포함되고 그 뒤에 아무것도 없는 모든 레코드에 대해 두 번째 필드를 인쇄합니다.

답변2

약간 개선됨조 로바의 답변:

sed -n 's/.*info2 \([^,]*\).*/\1/p' file
  • -n"특별히 지시하지 않는 한 아무것도 인쇄하지 마십시오"를 의미합니다. 이는 !d 일치하지 않는 행을 제거(무시)하기 위해 choroba를 사용하는 것과 같습니다 info2.
  • 이 명령의 내용은 쉼표(숫자뿐만 아니라)를 제외한 모든 문자의 시퀀스를 캡처하여 done에서 추출 할 수 있다는 점을 제외하면 choroba의 내용과 매우 유사합니다 info5 done,.
  • 명령은 p(print)로 끝납니다. 그렇지 않으면 를 사용할 때 -n아무것도 인쇄되지 않기 때문입니다.

이것의 장점은 레이블을 두 번 지정할 필요가 없다는 것입니다. (라인에 등이 포함되어 있으면 원하지 않는 결과가 생성되지 않습니다)infoNinfo20info21

답변3

2단계 솔루션:

tr ',' '\n' <file | sed -n 's/^ *info[25] *//p'

tr샘플 텍스트를 다음으로 변환

info1 218   
 info2 111  
 info3 415  
 info5 done 

그리고 sed스크립트는 info2info5문자열(및 주변 공백)을 제거하고 원하는 텍스트 조각을 남깁니다. 다른 행은 삭제됩니다.

결과:

111
done

awk예를 들어 완료하는 데 가장 적합합니다 .DopeGhoti의 솔루션.

awk내 접근 방식에 따른 변형 tr:

tr ',' '\n' <file | awk '/info[25]/ { print $2 }'

답변4

sed를 사용할 수 있습니다:

sed '/info2 [0-9]/!d;s/.*info2 \([0-9]*\).*/\1/' file
  • /info2/은 "주소"이며 해당 주소를 포함하는 모든 줄은 info2해당 주소와 일치하는 것으로 간주됩니다. !d"주소 외부의 줄 제거"를 의미하므로 포함된 줄만 info2다음 명령으로 처리됩니다.
  • 교체는 캡처 그룹을 사용하여 뒤에 오는 숫자를 기억하고 info2전체 줄(앞의 모든 것 info2, info2자체, 숫자 및 숫자 뒤의 모든 것)을 숫자로 바꿉니다.

뒤에 "done"을 캡처해야 하는 경우에는 info5사용할 수 없지만 쉼표가 아닌 [0-9]*으로 바꿀 수 있습니다 .[^,]*

관련 정보