두 패턴 사이의 모든 줄을 인쇄하려는 파일이 있습니다. Pattern1 = # Begin TRACE A Data
및 Pattern 2 = # Done Data $capture
, 패턴1과 패턴2 사이의 모든 줄을 인쇄하고 싶습니다.
파일 1:
# Lower Limit
LIMIT_FLAG=0
LIMIT_POINT0=2884982910000.000000 -102800 -1
LIMIT_POINT1=2892982910000.000000 -102800 -1
# Limit Done
# Begin SPA Emission Mask
MASK SEGMENTS=0
MASK REFERENCE MODE=0
MASK REFERENCE LEVEL=0
MASK CENTER FREQUENCY=0
**
# SPA Emission Mask Done
# Begin SPA Data
<AP P_DATA>
** # Begin TRACE A Data **
P_0=-103.976000 , 2884.982910 MHz
P_1=-103.580000 , 2884.997456 MHz
P_2=-103.748000 , 2885.012001 MHz
P_3=-104.020000 , 2885.026547 MHz
P_4=-103.472000 , 2885.041092 MHz
P_5=-103.720000 , 2885.055638 MHz
P_6=-103.752000 , 2885.070183 MHz
P_7=-103.512000 , 2885.084729 MHz
P_8=-103.664000 , 2885.099274 MHz
P_9=-103.948000 , 2885.113820 MHz
P_10=-103.720000 , 2885.128365 MHz
P_11=-103.480000 , 2885.142911
# Done Data $capture
# Begin SPA Emission Mask
MASK SEGMENTS=0
MASK REFERENCE MODE=0
MASK REFERENCE LEVEL=0
MASK CENTER FREQUENCY=0
# End SPA Data
<APP_DATA_END>
# End SPA Data
<APP_DATA_END>
예상 출력:
-103.976000 2884.982910
-103.580000 2884.997456
-103.748000 2885.012001
-104.020000 2885.026547
-103.472000 2885.041092
....
....
여분의 줄이나 빈 줄은 인쇄되지 않고, 줄 데이터만 인쇄되어야 합니다.
답변1
sed -n '/# Begin TRACE A Data/,/# Done Data $capture/{s/ MHz//;s/,/ /;s/.*=//p;}' filename
/pattern1/,/pattern2/
첫 번째부터 두 번째 패턴까지의 행만 선택되므로 내부의 모든 항목은{}
해당 범위에 대해서만 실행됩니다.s/ MHz//
후행 셀 제거s/,/ /
쉼표를 공백으로 바꾸기s/.*=//p
모든 것을 제거=
하고 범위 내의 줄만=
인쇄되도록 패턴을 인쇄합니다(옵션은-n
기본 출력을 억제함)
실제로 예제 데이터의 경우 다음을 수행할 수도 있습니다.
sed -n 's/ MHz//;s/.*=//;s/,/ /p'
원하는 줄에만 쉼표가 포함되어 있기 때문입니다.
답변2
Awk
해결책:
awk '/# Begin TRACE A Data/{ f = 1; next }
/# Done Data \$capture/{ f = 0 }
NF && f{ gsub(/^P.+=|,| MHz/, ""); print }' file
산출:
-103.976000 2884.982910
-103.580000 2884.997456
-103.748000 2885.012001
-104.020000 2885.026547
-103.472000 2885.041092
-103.720000 2885.055638
-103.752000 2885.070183
-103.512000 2885.084729
-103.664000 2885.099274
-103.948000 2885.113820
-103.720000 2885.128365
-103.480000 2885.142911