![텍스트 옆에 Sed 또는 Grep 번호를 사용하는 방법](https://linux55.com/image/126644/%ED%85%8D%EC%8A%A4%ED%8A%B8%20%EC%98%86%EC%97%90%20Sed%20%EB%98%90%EB%8A%94%20Grep%20%EB%B2%88%ED%98%B8%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95.png)
아래와 같은 파일이 있습니다. info2의 오른쪽 값을 반환하고 싶습니다. 둘째, 동일한 방식으로 info5의 값을 반환하고 싶습니다.
문서:
info1 218, info2 111, info3 415, info5 done,
답변1
그리고 awk
:
$ awk 'BEGIN { RS="," } $1 ~ /info[25]$/ { print $2 }' input
111
done
입력 레코드 구분 기호( RS
)를 쉼표로 설정한 다음 첫 번째 필드에 info
2 또는 5가 포함되고 그 뒤에 아무것도 없는 모든 레코드에 대해 두 번째 필드를 인쇄합니다.
답변2
약간 개선됨조 로바의 답변:
sed -n 's/.*info2 \([^,]*\).*/\1/p' file
-n
"특별히 지시하지 않는 한 아무것도 인쇄하지 마십시오"를 의미합니다. 이는!d
일치하지 않는 행을 제거(무시)하기 위해 choroba를 사용하는 것과 같습니다info2
.- 이 명령의 내용은 쉼표(숫자뿐만 아니라)를 제외한 모든 문자의 시퀀스를 캡처하여
done
에서 추출 할 수 있다는 점을 제외하면 choroba의 내용과 매우 유사합니다info5 done,
. - 명령은
p
(print)로 끝납니다. 그렇지 않으면 를 사용할 때-n
아무것도 인쇄되지 않기 때문입니다.
이것의 장점은 레이블을 두 번 지정할 필요가 없다는 것입니다. (라인에 등이 포함되어 있으면 원하지 않는 결과가 생성되지 않습니다)infoN
info20
info21
답변3
2단계 솔루션:
tr ',' '\n' <file | sed -n 's/^ *info[25] *//p'
tr
샘플 텍스트를 다음으로 변환
info1 218
info2 111
info3 415
info5 done
그리고 sed
스크립트는 info2
및 info5
문자열(및 주변 공백)을 제거하고 원하는 텍스트 조각을 남깁니다. 다른 행은 삭제됩니다.
결과:
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]*
으로 바꿀 수 있습니다 .[^,]*