파일에서 일치하는 항목 다음에 나오는 특정 줄을 가져옵니다.

파일에서 일치하는 항목 다음에 나오는 특정 줄을 가져옵니다.

이 패턴의 로그 파일이 있습니다.

Time = 100

GAMG:  Solving for p, Initial residual = 0.2174470886, Final residual = 0.01001676933, No Iterations 1
GAMG:  Solving for p, Initial residual = 0.02692910633, Final residual = 0.0004864615367, No Iterations 2
GAMG:  Solving for p, Initial residual = 0.005753534485, Final residual = 0.0001502172182, No Iterations 2
GAMG:  Solving for p, Initial residual = 0.001526301953, Final residual = 5.384448346e-05, No Iterations 2
GAMG:  Solving for p, Initial residual = 0.0004529702305, Final residual = 1.80754637e-05, No Iterations 1
time step continuity errors : sum local = 2.722585271, global = 0.09763545089, cumulative = 0.09763545089
ExecutionTime = 27.35 s  ClockTime = 31 s

Time = 101

GAMG:  Solving for p, Initial residual = 0.04799119366, Final residual = 0.002390404161, No Iterations 1
GAMG:  Solving for p, Initial residual = 0.02803010067, Final residual = 0.0009371130484, No Iterations 2
GAMG:  Solving for p, Initial residual = 0.007210353379, Final residual = 0.0002494798057, No Iterations 2
GAMG:  Solving for p, Initial residual = 0.002410795933, Final residual = 0.000116871876, No Iterations 2
GAMG:  Solving for p, Initial residual = 0.0007431402835, Final residual = 1.649739876e-05, No Iterations 3
GAMG:  Solving for p, Initial residual = 0.0003489407136, Final residual = 1.262095062e-05, No Iterations 1
time step continuity errors : sum local = 0.7142966337, global = -0.1125594528, cumulative = -0.01492400189
ExecutionTime = 41.42 s  ClockTime = 45 s

Time = 102

그 다음 줄은 Time =항상 입니다 Iterations 1. 저는 그 줄을 얻고 싶습니다. 나는 다음과 같은 아이디어를 시도했습니다.

grep을 사용하여 쓰면 다음과 같이 grep -A 2 "Time =" test.txt표시됩니다.

Time = 100

GAMG:  Solving for p, Initial residual = 0.2174470886, Final residual = 0.01001676933, No Iterations 1

그리고

ExecutionTime = 27.35 s  ClockTime = 31 s

Time = 101

awk를 사용하면 cat test.txt | awk '/Time/{getline;getline;print}'표시됩니다.

GAMG:  Solving for p, Initial residual = 0.2174470886, Final residual = 0.01001676933, No Iterations 1
Time = 101
Time = 102

그 뒤에 나오는 두 줄은 Time = 101and 입니다 .Time = 102ExecutionTime

간단히 말해서, 나는 공백이 아닌 첫 번째 줄을 얻고 싶습니다. 그 이후에는 Time =항상 Iterations 1. 어떻게 얻을 수 있나요?

답변1

No Iterations 1한 줄로 끝나는 첫 번째 줄이 인쇄 되도록 하려면 Time = ...다음 awk명령을 사용할 수 있습니다.

awk '/^Time =/ {f=1} /No Iterations 1$/ && f {f=0; print}' test.txt

awk명령에는 두 가지 규칙( { ... })이 있습니다.

  • ^Time =행이 정규식과 일치하면, 즉 문자열로 시작하면 첫 번째 행이 처리됩니다 Time =. 이 규칙에서는 발견된 패턴의 "시작선"을 나타내는 f플래그 를 설정하기만 하면 됩니다 .1
  • No Iterations 1$행이 정규식과 일치하면 다음을 처리합니다.마치다문자열을 사용하십시오 No Iterations 1.그리고우리는 그것을 이전에 발견했습니다 Time =- 좋습니다. 두 조건이 모두 충족되면 행을 인쇄하고 f로 시작하는 다음 항목이 인쇄되지 않도록 플래그를 재설정합니다 No Iterations 1.

명령문 뒤에 비어 있지 않은 첫 번째 줄만 인쇄하는 Time = ...(패턴이 포함되어 있는지 확인하지 않고 No Iterations 1) 좀 더 "완화된" 변형은 다음과 같습니다.

awk '/^Time =/ {f=1; next} NF>0 && f {f=0; print}' test.txt

f이는 플래그가 설정되어 있는지와 NF행의 "필드 수"(또는 원하는 경우 열 수)가 0보다 큰지 확인하는 것뿐입니다 . 여기서는 next다음 줄로 실행을 건너뛰기 위해 첫 번째 규칙에 명령을 추가 해야 합니다 . 그렇지 않으면 -rule이 NF>0이미 Time =-lines에 대해 처리되어 해당 -lines만 효과적으로 인쇄됩니다.

귀하의 예를 들어, 둘 다 인쇄합니다:

GAMG:  Solving for p, Initial residual = 0.2174470886, Final residual = 0.01001676933, No Iterations 1
GAMG:  Solving for p, Initial residual = 0.04799119366, Final residual = 0.002390404161, No Iterations 1

관련 정보