필드 중 하나 내에서 일치하는 부분 하위 문자열을 기반으로 여러 필드를 인쇄합니다.

필드 중 하나 내에서 일치하는 부분 하위 문자열을 기반으로 여러 필드를 인쇄합니다.

이 데이터로 판단하면:

"STRING1","c45621396a774a7a79b095a1b73b1d3b","2016-04-14T19:39:41.529978","1.0.4.4","7-sp1.0-amd64","","10.224.241.219|0.0.0.0|0.0.0.0|192.168.0.6|0.0.0.0"
"STRING2","c5815139f3051de2ab67909b03a01203","2016-04-14T19:37:47.991569","1.0.4.4","7-sp1.0-amd64","","10.230.16.188"
"STRING3","c837513923e2abfe4df41c2240d1c869","2016-04-14T19:40:10.385759","1.0.4.4","7-sp1.0-amd64","","0.0.0.0|0.0.0.0|0.0.0.0|10.226.41.43"
"STRING4","c837544923e2abfe4df41c2240d1c869","2016-04-14T19:40:10.385779","1.0.4.4","7-sp0.0-amd64","","8.8.8.8|0.0.0.0|0.0.0.0|0.0.0.0|10.226.41.43"
"STRING5","c837544003e2abfe4df41c2240d1c869","2016-04-14T19:40:10.382379","1.0.4.4","7-sp0.0-amd64","","0.0.0.0|10.20.40.6|0.0.0.0|10.226.41.43"

난 그냥 간직하고 싶어

  • 첫 번째 필드(예측할 수 없는 영숫자/길이의 문자열) 및
  • 여섯 번째 필드부터 10으로 시작하는 IP 주소만 있습니다(하나 이상이 있을 수 있음).

아래 예에 따르면 원하는 출력은 다음과 같습니다.

STRING1 10.224.241.219
STRING2 10.230.16.188
STRING3 10.226.41.43
STRING4 10.226.41.43
STRING5 10.20.40.6 10.226.41.43

이를 달성하기 위해 sed/awk에는 어떤 마법이 있습니까? GNU/Linux 시스템이나 cygwin의 표준 텍스트 처리 유틸리티를 사용하여 이를 달성할 수 있습니다.

감사해요

답변1

필드에 쉼표가 포함되어 있지 않으면 다음을 시도해 볼 수 있습니다.

$ perl -F, -lane '@k=split(/["|]/,$F[6]); 
                  @l=grep{/^10\./}@k; 
                  print "$F[0] @l"' file | 
    sed 's/"//g'
STRING1 10.224.241.219
STRING2 10.230.16.188
STRING3 10.226.41.43
STRING4 10.226.41.43
STRING5 10.20.40.6 10.226.41.43

설명하다

-aPerl에는 이와 같이 작동하도록 하는 옵션이 있습니다 awk. Perl은 주어진 값을 기준으로 입력 파일을 분할 -F하고 각 결과 필드를 배열의 요소로 저장합니다 @F. 따라서 첫 번째 필드는 $F[0], 두 번째 필드 $F[1]는 등이 됩니다 . 이 옵션은 -l각 호출에 개행 문자를 추가하고 입력 파일을 한 줄씩 읽고 주어진 스크립트를 각 줄에 적용하도록 지시합니다.print-nperl-e

  • @k=split(/["|]/,$F[6]);: 7번째 필드를 "or 로 분할하여 |배열로 저장합니다 @k. 이것이 IP가 됩니다.
  • @l=grep{/^10\./}@k;: @ka로 시작하는 모든 필드를 배열에 저장합니다.10@l
  • print "$F[0] @l":첫 번째 필드와 그 안의 모든 내용을 인쇄합니다 @l.
  • sed 's/"//g': 따옴표를 제거합니다. 입력 라인은 다른 것이 실행되기 전에 분할 되므로 perl다른 프로그램을 사용하는 것이 더 쉽습니다.

임시 배열 변수를 사용하지 않고 Perl 스크립트를 단축할 수도 있습니다.

perl -F, -lane 'print "$F[0] ", join " ", grep{/^10\..*/} split(/["|]/,$F[6])' file

관련 정보