sed - 패턴이 누락된 경우에만 줄을 인쇄합니다.

sed - 패턴이 누락된 경우에만 줄을 인쇄합니다.

구문 분석해야 하는 많은 수의 행을 출력하는 명령이 있습니다.

출력은 다음과 같습니다.

  PORT-A 3 HOSTNAME PRODUCT1 14 29
  PORT-B 7 HOSTNAME PRODUCT2 22 18 41
  PORT-C 9 HOSTNAME PRODUCT2 22 18 41
  PORT-D 4 HOSTNAME PRODUCT1 14
  PORT-B 2 HOSTNAME PRODUCT1 

sed -nr '/PRODUCT1|14|29/p'각 패턴에 맞는 라인만 인쇄 해봤습니다 .

다음을 사용하여 출력 sed -nr '/PRODUCT1|14|29/p':

  PORT-A 3 HOSTNAME PRODUCT1 14 29
  PORT-D 4 HOSTNAME PRODUCT1 14
  PORT-B 2 HOSTNAME PRODUCT1

sed3가지 패턴 중 하나가 누락된 경우 에만 이 줄을 인쇄하고 싶습니다 . 이를 달성하는 방법에 대한 아이디어가 있습니까?

이상적인 출력:

  PORT-D 4 HOSTNAME PRODUCT1 14
  PORT-B 2 HOSTNAME PRODUCT1

답변1

이 일을 쉽게 할 수 있을 것 같지 않습니다 sed. 귀하의 요구 사항을 올바르게 이해했다면 세 가지 패턴 중 정확히 하나가 일치하지 않고 패턴 중 정확히 두 개가 일치하지 않으면 다음 줄을 인쇄하고 싶습니다.하다성냥. sed에서는 세 가지 실행 경로가 필요합니다. 각 경우에 두 패턴이 각각 성공적으로 일치하는지 테스트하고 세 번째 패턴이 성공적으로 일치하는지 테스트해야 합니다.

완전성을 위해 다음 sed스크립트는 사용자가 요구하는 작업을 수행합니다.

sed -nr '/PRODUCT1/{/14/{/29/!p}};/14/{/29/{/PRODUCT1/!p}};/PRODUCT1/{/29/{/14/!p}}'

이는 O(n^2)의 복잡도로 정규식 일치를 수행합니다. 더 많은 필드를 테스트하기 위해 더 많은 패턴을 추가하면 다루기가 어려워집니다.

awkperl카운터 변수를 구현할 수 있는 곳에서 이와 같은 작업을 수행하는 것이 더 나을 수도 있습니다 . 이러한 언어에서는 각 패턴이 테스트되고 일치하면 카운터가 증가하며 테스트된 각 패턴에 대해 다른 카운터가 증가합니다. 일치 카운터가 패턴 카운터보다 1 적으면 해당 행을 인쇄합니다.

관련 정보